From 14478b4f54f6e367d9342045ae16d5f8da2e7f62 Mon Sep 17 00:00:00 2001 From: 0xflotus <0xflotus@gmail.com> Date: Sun, 12 Jul 2020 19:47:49 +0200 Subject: [PATCH 001/119] (docs): fixed small errors --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 4bc4672..bc560d7 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ Typed JSON parsing and serializing for TypeScript with [decorators](https://gith - Seamlessly integrate into existing code with [decorators](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md), ultra-lightweight syntax - Parse standard JSON to typed class instances, safely, without requiring any type-information to be specified in the source JSON - - _Note: polymorphic object structures require simple type-annotations to be present in JSON, this is configurable to be complatible with other serializers, like [Json.NET](https://www.newtonsoft.com/json)_ + - _Note: polymorphic object structures require simple type-annotations to be present in JSON, this is configurable to be compatible with other serializers, like [Json.NET](https://www.newtonsoft.com/json)_ ## Installation @@ -165,7 +165,7 @@ You can set it globally or on TypedJSON instance to have everything preserve nul On `@jsonObject` you can specify name of methods to be called before serializing the object or after it was deserialized. This method can be a static method or instance member. In case you have static and member with the same name - the member method is preferred. -#### serilizer and deseralizer +#### serializer and deserializer On `@jsonMember` decorator family you can provide your own functions to perform custom serialization and deserialization. This could be useful if you want to transform your input/output. For example, if instead of using javascript Date object you want to use moment.js object, you could use code like this: From b0c8779c0c1f4c2af95111e7f1b261a10e60bd6e Mon Sep 17 00:00:00 2001 From: Simon Umbricht Date: Wed, 17 Jun 2020 22:38:34 +0200 Subject: [PATCH 002/119] Fix error when converting Date object (instead of datestring) to Date --- spec/just-json.spec.ts | 3 +++ src/typedjson/deserializer.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index adda2ab..c0bbc1b 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -63,12 +63,15 @@ describe('json (without automatic stringify)', function () { propNum: number; @jsonArrayMember(String) propArr: String[]; + @jsonMember + propDate: Date; } const json = Object.freeze({ propStr: 'dsgs', propNum: 653, propArr: ['dslfks'], + propDate: new Date(1543915254), }); it('should deserialize', function () { diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 33c2b67..ecd5602 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -274,6 +274,8 @@ export class Deserializer if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) return new Date(sourceObject as any); + else if (sourceObject instanceof Date) + return sourceObject else this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); } From 9cc535638607934197163bed47bb3b3f4d707413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sun, 12 Jul 2020 21:59:03 +0200 Subject: [PATCH 003/119] 1.5.2 --- js/typedjson.js | 4 +++- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 ++-- js/typedjson.min.js.map | 2 +- package-lock.json | 2 +- package.json | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/js/typedjson.js b/js/typedjson.js index 63e85f1..154e2a4 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.5.1 - 2020-02-09 +// [typedjson] Version: 1.5.2 - 2020-07-12 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -902,6 +902,8 @@ var deserializer_Deserializer = /** @class */ (function () { // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) return new Date(sourceObject); + else if (sourceObject instanceof Date) + return sourceObject; else this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); } diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 029e9ae..cc381d9 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/options-base.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/parser.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/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\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/options-base.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/parser.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/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 784cb0f..52a758b 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.5.1 - 2020-02-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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r(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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\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/options-base.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/parser.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/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","METADATA_FIELD_KEY","MISSING_REFLECT_CONF_MSG","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","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","getKnownTypeNameFromType","dataMembers","Map","knownTypes","Set","isHandledWithoutAnnotation","injectMetadataInformation","propKey","objectMetadata","decoratorName","deserializer","parentMetadata","forEach","_metadata","_propKey","set","Object","defineProperty","enumerable","configurable","writable","add","keyType","elementType","elemCtor","keys","key","undefined","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","assign","defaultTypeEmitter","targetObject","sourceObject","expectedSourceType","sourceTypeMetadata","__type","setTypeHintEmitter","typeEmitterCallback","TypeError","_typeHintEmitter","setErrorHandler","errorHandlerCallback","_errorHandler","convertSingleValue","typeInfo","memberName","memberOptions","retrievePreserveNull","selfType","convertAsArrayBuffer","convertAsDataView","Array","convertAsArray","elementTypes","convertAsSet","convertAsMap","convertAsTypedArray","convertAsObject","expectedName","actualName","beforeSerializationMethodName","objMemberMetadata","serialized","objMemberOptions","serializer","expectedElementType","element","i","expectedTypeName","actualTypeName","typeInfoForElements","slice","map","elementTypeInfo","resultArray","resultElement","push","expectedKeyType","keyTypeInfo","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","defaultTypeResolver","get","setNameResolver","nameResolverCallback","_nameResolver","setTypeResolver","typeResolverCallback","_typeResolver","sourceObjectTypeInfo","objectName","expectedSelfType","selfConstructor","sourceObjectMetadata","knownTypeConstructors","_mergeKnownTypes","_createKnownTypesMap","typeFromTypeHint","revivedValue","objMemberValue","objMemberDebugName","elementConstructor","keyConstructor","isRequired","initializerCallback","e","_instantiateType","onDeserializedMethodName","sourceKey","srcTypeNameForDebug","_makeTypeErrorMessage","_throwTypeMismatchError","_convertAsFloatArray","_convertAsUintArray","_stringToArrayBuffer","_stringToDataView","isArray","resultSet","valueTypeInfo","resultMap","arrayType","every","elem","isNaN","targetType","actualSourceType","actualType","result","knownTypeMaps","knowTypes","knownTypeMeta","str","buf","bufView","strLen","charCodeAt","object","rootType","settings","TypedJSON","parseAsArray","dimensions","parseAsSet","parseAsMap","valueType","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","concat","errorHandler","replacer","typeResolver","typeHintEmitter","indent","nameResolver","knownType","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","fill","_mapKnownTypes","elementConstructorArray","constructors","jsonObject","optionsOrTarget","decorator","target","memberMetadata","onDeserialized","beforeSerialization","initializer","optionsBase","knownTypeMethodName","jsonMember","propCtor","isSpecialPropertyType","emitDefaultValue","toString","reflectPropCtor","jsonArrayMember","elementCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6ee3e1b..67e7796 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.5.1", + "version": "1.5.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2dccda0..46279c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.5.1", + "version": "1.5.2", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", From 06ecf4ad5a7679b7d5b57cfe8e2a04bd85391b83 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 14 Jul 2020 22:56:59 +0000 Subject: [PATCH 004/119] Whitelist package contents Instead of blacklisting unwanted files for npm packing, whitelist wanted ones. Blacklisting, by nature, can easily result in unwanted files getting packed. --- .npmignore | 12 ------------ package.json | 5 ++++- 2 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index cca1243..0000000 --- a/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -src/ -src_v0/ -spec/ -package-lock.json -tsconfig.json -webpack.config.js -.idea/ -.vscode/ -.gitattributes -.travis.yml -*.iml - diff --git a/package.json b/package.json index 46279c6..5ad6b2e 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,8 @@ "webpack": "^4.41.5", "webpack-auto-inject-version": "^1.2.2", "webpack-cli": "^3.3.10" - } + }, + "files": [ + "js" + ] } From c9010862028624ccdd64c28a87643343aca1364e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sat, 30 May 2020 01:05:44 +0200 Subject: [PATCH 005/119] Type descriptors and Map shapes --- package-lock.json | 32 +++- package.json | 2 +- spec/map.spec.ts | 146 +++++++++++++++ spec/set.spec.ts | 80 ++++++++- src/parser.ts | 95 +++------- src/typedjson.ts | 1 + src/typedjson/deserializer.ts | 275 +++++++++++++++++------------ src/typedjson/json-array-member.ts | 25 ++- src/typedjson/json-map-member.ts | 20 ++- src/typedjson/json-member.ts | 39 ++-- src/typedjson/json-set-member.ts | 6 +- src/typedjson/metadata.ts | 21 +-- src/typedjson/serializer.ts | 175 +++++++----------- src/typedjson/type-descriptor.ts | 115 ++++++++++++ 14 files changed, 683 insertions(+), 349 deletions(-) create mode 100644 spec/map.spec.ts create mode 100644 src/typedjson/type-descriptor.ts diff --git a/package-lock.json b/package-lock.json index 67e7796..8756c5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3336,9 +3336,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "mamacro": { @@ -4995,16 +4995,34 @@ } }, "ts-node": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", - "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", + "source-map-support": "^0.5.17", "yn": "3.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } } }, "tslib": { diff --git a/package.json b/package.json index 5ad6b2e..3418541 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.16", "ts-loader": "^6.2.1", - "ts-node": "^8.6.2", + "ts-node": "^8.10.2", "typescript": "^3.7.5", "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.41.5", diff --git a/spec/map.spec.ts b/spec/map.spec.ts new file mode 100644 index 0000000..b2a7791 --- /dev/null +++ b/spec/map.spec.ts @@ -0,0 +1,146 @@ +import { jsonObject } from '../src/typedjson/json-object'; +import { jsonMember } from '../src/typedjson/json-member'; +import { TypedJSON } from '../src/parser'; +import { ArrayT, jsonMapMember } from '../src/typedjson'; +import { MapShape } from '../src/typedjson/type-descriptor'; + +describe('map dictionary shape', function () { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init: { strProp: string, numProp: number }) + constructor() + constructor(init?: { strProp: string, numProp: number }) { + if (init) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + public foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class DictMap { + @jsonMapMember(String, Simple, { shape: MapShape.OBJECT}) + prop: Map; + + public getSetSize() { + return this.prop.size; + } + } + + it('deserializes', function () { + const result = TypedJSON.parse(JSON.stringify( + { + prop: { + one: {strProp: 'delta', numProp: 4}, + two: {strProp: 'gamma', numProp: 7}, + } + }), + DictMap); + + expect(result).toBeInstanceOf(DictMap); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Map); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(result.prop.get('one').strProp).toBe('delta'); + expect(result.prop.get('two').strProp).toBe('gamma'); + }); + + it('serializes', function () { + const object = new DictMap(); + object.prop = new Map([ + ['one', new Simple({strProp: 'delta', numProp: 4})], + ['two', new Simple({strProp: 'gamma', numProp: 7})], + ]); + const result = TypedJSON.stringify(object, DictMap); + + expect(result).toBe(JSON.stringify({ + prop: { + one: {strProp: 'delta', numProp: 4}, + two: {strProp: 'gamma', numProp: 7}, + } + })); + }); +}); + +describe('map of array dictionary shape', function () { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init: { strProp: string, numProp: number }) + constructor() + constructor(init?: { strProp: string, numProp: number }) { + if (init) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + public foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class DictArrayMap { + @jsonMapMember(String, ArrayT(Simple), { shape: MapShape.OBJECT}) + prop: Map; + + public getSetSize() { + return this.prop.size; + } + } + + it('deserializes', function () { + const result = TypedJSON.parse(JSON.stringify( + { + prop: { + one: [{strProp: 'delta', numProp: 4}], + two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], + } + }), + DictArrayMap); + + expect(result).toBeInstanceOf(DictArrayMap); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Map); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(result.prop.get('one').length).toBe(1); + expect(result.prop.get('one')[0].foo()).toBe('delta-4'); + expect(result.prop.get('two').length).toBe(2); + expect(result.prop.get('two')[0].foo()).toBe('gamma-7'); + expect(result.prop.get('two')[1].foo()).toBe('alpha-2'); + }); + + it('serializes', function () { + const object = new DictArrayMap(); + object.prop = new Map([ + ['one', [new Simple({strProp: 'delta', numProp: 4})]], + ['two', [new Simple({strProp: 'gamma', numProp: 7}), new Simple({strProp: 'alpha', numProp: 2})]], + ]); + const result = TypedJSON.stringify(object, DictArrayMap); + + expect(result).toBe(JSON.stringify({ + prop: { + one: [{strProp: 'delta', numProp: 4}], + two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], + } + })); + }); +}); diff --git a/spec/set.spec.ts b/spec/set.spec.ts index 4edf46e..2b8d2e1 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,5 +1,5 @@ -import { jsonObject, jsonMember, jsonArrayMember, TypedJSON, jsonSetMember } from "../src/typedjson"; -import { Everything, IEverything } from "./utils/everything"; +import { ArrayT, SetT, jsonObject, jsonMember, TypedJSON, jsonSetMember } from "../src/typedjson"; +import { Everything } from "./utils/everything"; describe('set of objects', function () { @jsonObject @@ -95,6 +95,82 @@ describe('set member', function () { }); }); +describe('set array member', function () { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init: { strProp: string, numProp: number }) + constructor() + constructor(init?: { strProp: string, numProp: number }) { + if (init) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + public foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class WithSet { + @jsonMember({constructor: SetT(ArrayT(Simple))}) + prop: Set; + + public getSetSize() { + return this.prop.size; + } + } + + it('deserializes', function () { + const result = TypedJSON.parse(JSON.stringify( + {prop: [ + [ + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, + ], + [ + {strProp: 'alpha', numProp: 3245}, + {strProp: 'zeta', numProp: 4358}, + ] + ] + }), + WithSet); + + expect(result).toBeInstanceOf(WithSet); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Set); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(Array.from(result.prop)).toEqual([ + [ + new Simple({strProp: 'delta', numProp: 4}), + new Simple({strProp: 'bravo', numProp: 2}), + new Simple({strProp: 'gamma', numProp: 0}), + ], + [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], + ]) + }); + + it('serializes', function () { + const object = new WithSet(); + object.prop = new Set([ + [new Simple({strProp: 'delta', numProp: 4})], + [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], + ]); + const result = TypedJSON.stringify(object, WithSet); + + expect(result).toBe(JSON.stringify({prop: [[{strProp: 'delta', numProp: 4}], [{strProp: 'alpha', numProp: 3245}, {strProp: 'zeta', numProp: 4358}]]})); + }); +}); + describe('set of raw objects', function () { @jsonObject class WithRawSet { diff --git a/src/parser.ts b/src/parser.ts index 1a1ea12..14ee1d6 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,9 +1,11 @@ -import { Constructor } from "./typedjson/types"; +import { Constructor, IndexedObject } from "./typedjson/types"; import { Serializer, TypeHintEmitter } from "./typedjson/serializer"; import { Deserializer, TypeResolver } from "./typedjson/deserializer"; import { JsonObjectMetadata } from "./typedjson/metadata"; import { logError, logWarning, nameof, parseToJSObject } from "./typedjson/helpers"; import { extractOptionBase, OptionsBase } from "./typedjson/options-base"; +import { createArrayType } from "./typedjson/json-array-member"; +import { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor'; export type JsonTypes = Object|boolean|string|number|null|undefined; export { TypeResolver, TypeHintEmitter }; @@ -150,7 +152,7 @@ export class TypedJSON keyCtor: Constructor, valueCtor: Constructor, settings?: ITypedJSONSettings, - ): { key: any, value: any }[]|undefined { + ): IndexedObject|{ key: any, value: any }[]|undefined { return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); } @@ -227,7 +229,7 @@ export class TypedJSON /** * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object * instances of the specified root class type. - * @param rootType The constructor of the root class type. + * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings) @@ -344,10 +346,11 @@ export class TypedJSON try { - result = this.deserializer.convertSingleValue(json, { - selfConstructor: this.rootConstructor, - knownTypes: knownTypes, - }) as T; + result = this.deserializer.convertSingleValue( + json, + ensureTypeDescriptor(this.rootConstructor), + knownTypes, + ) as T; } catch (e) { @@ -366,68 +369,29 @@ export class TypedJSON public parseAsArray(object: any, dimensions: number = 1): any[] { const json = parseToJSObject(object, Array); - if (json instanceof Array) - { - return this.deserializer.convertAsArray(json, { - selfConstructor: Array, - elementConstructor: new Array(dimensions - 1) - .fill(Array) - .concat(this.rootConstructor), - knownTypes: this._mapKnownTypes(this.globalKnownTypes), - }); - } - else - { - this.errorHandler(new TypeError(`Expected 'json' to define an Array` - + `, but got ${typeof json}.`)); - } - - return []; + return this.deserializer.convertAsArray(json, + createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), + this._mapKnownTypes(this.globalKnownTypes), + ); } public parseAsSet(object: any): Set { const json = parseToJSObject(object, Set); - // A Set is serialized as T[]. - if (json instanceof Array) - { - return this.deserializer.convertAsSet(json, { - selfConstructor: Array, - elementConstructor: [this.rootConstructor], - knownTypes: this._mapKnownTypes(this.globalKnownTypes) - }); - } - else - { - this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)` - + `, but got ${typeof json}.`, - )); - } - - return new Set(); + return this.deserializer.convertAsSet(json, + SetT(this.rootConstructor), + this._mapKnownTypes(this.globalKnownTypes) + ); } public parseAsMap(object: any, keyConstructor: Constructor): Map { const json = parseToJSObject(object, Map); - // A Set is serialized as T[]. - if (json instanceof Array) - { - return this.deserializer.convertAsMap(json, { - selfConstructor: Array, - elementConstructor: [this.rootConstructor], - knownTypes: this._mapKnownTypes(this.globalKnownTypes), - keyConstructor: keyConstructor - }); - } - else - { - this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)` - + `, but got ${typeof json}.`, - )); - } - - return new Map(); + return this.deserializer.convertAsMap( + json, + MapT(keyConstructor, this.rootConstructor), + this._mapKnownTypes(this.globalKnownTypes), + ); } /** @@ -441,7 +405,7 @@ export class TypedJSON { return this.serializer.convertSingleValue( object, - {selfType: this.rootConstructor}, + ensureTypeDescriptor(this.rootConstructor), ); } catch (e) @@ -459,9 +423,8 @@ export class TypedJSON { try { - const elementConstructorArray = - new Array(dimensions - 1).fill(Array).concat(this.rootConstructor); - return this.serializer.convertAsArray(object, elementConstructorArray); + return this.serializer.convertAsArray( + object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); } catch (e) { @@ -473,7 +436,7 @@ export class TypedJSON { try { - return this.serializer.convertAsSet(object, this.rootConstructor); + return this.serializer.convertAsSet(object, SetT(this.rootConstructor)); } catch (e) { @@ -481,11 +444,11 @@ export class TypedJSON } } - public toPlainMap(object: Map, keyConstructor: Constructor): { key: any, value: any }[]|undefined + public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined { try { - return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor); + return this.serializer.convertAsMap(object, MapT(keyConstructor, this.rootConstructor)); } catch (e) { diff --git a/src/typedjson.ts b/src/typedjson.ts index 307ab6b..ec14b16 100644 --- a/src/typedjson.ts +++ b/src/typedjson.ts @@ -5,3 +5,4 @@ export { jsonArrayMember } from "./typedjson/json-array-member"; export { jsonSetMember } from "./typedjson/json-set-member"; export { jsonMapMember } from "./typedjson/json-map-member"; export { toJson } from "./typedjson/to-json"; +export { ArrayT, SetT, MapT } from "./typedjson/type-descriptor"; diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index ecd5602..3e47700 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -1,15 +1,15 @@ -import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from "./helpers"; +import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from "./helpers"; import { Constructor, IndexedObject } from "./types"; import { JsonObjectMetadata } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; - -export interface IScopeTypeInfo -{ - selfConstructor: Function; - elementConstructor?: Function[]; - keyConstructor?: Function; - knownTypes: Map; -} +import { + ArrayTypeDescriptor, + ConcreteTypeDescriptor, + MapShape, + MapTypeDescriptor, + SetTypeDescriptor, + TypeDescriptor, +} from "./type-descriptor"; export type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null; @@ -56,7 +56,8 @@ export class Deserializer public convertAsObject( sourceObject: IndexedObject, - sourceObjectTypeInfo: IScopeTypeInfo, + typeDescriptor: ConcreteTypeDescriptor, + knownTypes: Map, objectName = "object", memberOptions?: OptionsBase, ) { @@ -66,9 +67,9 @@ export class Deserializer return undefined; } - let expectedSelfType = sourceObjectTypeInfo.selfConstructor; + let expectedSelfType = typeDescriptor.ctor; let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType); - let knownTypeConstructors = sourceObjectTypeInfo.knownTypes; + let knownTypeConstructors = knownTypes; if (sourceObjectMetadata) { @@ -119,21 +120,22 @@ export class Deserializer const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let revivedValue; - if (objMemberMetadata.deserializer) { + if (objMemberMetadata.deserializer) + { revivedValue = objMemberMetadata.deserializer(objMemberValue); - } else if (objMemberMetadata.ctor) { + } + else if (objMemberMetadata.type) + { revivedValue = this.convertSingleValue( objMemberValue, - { - selfConstructor: objMemberMetadata.ctor, - elementConstructor: objMemberMetadata.elementType, - keyConstructor: objMemberMetadata.keyType, - knownTypes: knownTypeConstructors - }, + objMemberMetadata.type, + knownTypeConstructors, objMemberDebugName, objMemberOptions, ); - } else { + } + else + { throw new TypeError( `Cannot deserialize ${objMemberDebugName} there is` + ` no constructor nor deserialization function to use.`, @@ -223,16 +225,16 @@ export class Deserializer else { // Untyped deserialization into Object instance. - let targetObject = {} as IndexedObject; + const targetObject = {} as IndexedObject; Object.keys(sourceObject).forEach(sourceKey => { - targetObject[sourceKey] = this.convertSingleValue(sourceObject[sourceKey], { - selfConstructor: sourceObject[sourceKey].constructor, - knownTypes: sourceObjectTypeInfo.knownTypes, - elementConstructor: sourceObjectTypeInfo.elementConstructor, - keyConstructor: sourceObjectTypeInfo.keyConstructor - }, sourceKey); + targetObject[sourceKey] = this.convertSingleValue( + sourceObject[sourceKey], + new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), + knownTypes, + sourceKey + ); }); return targetObject; @@ -241,11 +243,12 @@ export class Deserializer public convertSingleValue( sourceObject: any, - typeInfo: IScopeTypeInfo, + typeDescriptor: TypeDescriptor, + knownTypes: Map, memberName = "object", memberOptions?: OptionsBase, ) { - let expectedSelfType = typeInfo.selfConstructor; + const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor; let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : "undefined"; if (this.retrievePreserveNull(memberOptions) && sourceObject === null) @@ -256,18 +259,18 @@ export class Deserializer { return; } - else if (isDirectlyDeserializableNativeType(expectedSelfType)) + else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor)) { - if (sourceObject.constructor === expectedSelfType) + if (sourceObject.constructor === typeDescriptor.ctor) { return sourceObject; } else { - throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName)); + throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName)); } } - else if (expectedSelfType === Date) + else if (expectedTypeIsConcrete && typeDescriptor.ctor === Date) { // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime @@ -279,74 +282,81 @@ export class Deserializer else this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array) + else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array)) { // Deserialize Float Array from number[]. return this._convertAsFloatArray( sourceObject, - expectedSelfType as any, + typeDescriptor as any, srcTypeNameForDebug, memberName, ); } else if ( - expectedSelfType === Uint8Array - || expectedSelfType === Uint8ClampedArray - || expectedSelfType === Uint16Array - || expectedSelfType === Uint32Array + expectedTypeIsConcrete && ( + typeDescriptor.ctor === Uint8Array + || typeDescriptor.ctor === Uint8ClampedArray + || typeDescriptor.ctor === Uint16Array + || typeDescriptor.ctor === Uint32Array + ) ) { // Deserialize Uint array from number[]. return this._convertAsUintArray( sourceObject, - expectedSelfType as any, + typeDescriptor.ctor as any, srcTypeNameForDebug, memberName, ); } - else if (expectedSelfType === ArrayBuffer) + else if (expectedTypeIsConcrete && typeDescriptor.ctor === ArrayBuffer) { if (typeof sourceObject === "string") return this._stringToArrayBuffer(sourceObject); else this._throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === DataView) + else if (expectedTypeIsConcrete && typeDescriptor.ctor === DataView) { if (typeof sourceObject === "string") return this._stringToDataView(sourceObject); else this._throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Array) + else if (typeDescriptor instanceof ArrayTypeDescriptor) { if (Array.isArray(sourceObject)) - return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); else throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)); } - else if (expectedSelfType === Set) + else if (typeDescriptor instanceof SetTypeDescriptor) { if (Array.isArray(sourceObject)) - return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); else this._throwTypeMismatchError("Set", "Array", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Map) + else if (typeDescriptor instanceof MapTypeDescriptor) { - if (Array.isArray(sourceObject)) - return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions); + if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape)) + { + return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); + } else + { this._throwTypeMismatchError("Map", "a source array of key-value-pair objects", srcTypeNameForDebug, memberName); + } } else if (sourceObject && typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); } } public convertAsArray( sourceObject: any, - typeInfo: IScopeTypeInfo, + typeDescriptor: ArrayTypeDescriptor, + knownTypes: Map, memberName = "object", memberOptions?: OptionsBase, ): any[] { @@ -356,25 +366,24 @@ export class Deserializer return []; } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) + if (!typeDescriptor.elementType) { this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`)); return []; } - let elementTypeInfo: IScopeTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; - - return sourceObject.map(element => - { + return sourceObject.map(element => { // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty // entries, as an Array is ordered. try { - return this.convertSingleValue(element, elementTypeInfo, `${memberName}[]`, memberOptions); + return this.convertSingleValue( + element, + typeDescriptor.elementType, + knownTypes, + `${memberName}[]`, + memberOptions, + ); } catch (e) { @@ -389,7 +398,8 @@ export class Deserializer public convertAsSet( sourceObject: any, - typeInfo: IScopeTypeInfo, + typeDescriptor: SetTypeDescriptor, + knownTypes: Map, memberName = "object", memberOptions?: OptionsBase, ): Set { @@ -399,26 +409,21 @@ export class Deserializer return new Set(); } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) + if (!typeDescriptor.elementType) { this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`)); return new Set(); } - let elementTypeInfo: IScopeTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; - let resultSet = new Set(); + const resultSet = new Set(); - sourceObject.forEach((element, i) => - { + sourceObject.forEach((element, i) => { try { resultSet.add(this.convertSingleValue( element, - elementTypeInfo, + typeDescriptor.elementType, + knownTypes, `${memberName}[${i}]`, memberOptions, )); @@ -436,65 +441,103 @@ export class Deserializer public convertAsMap( sourceObject: any, - typeInfo: IScopeTypeInfo, + typeDescriptor: MapTypeDescriptor, + knownTypes: Map, memberName = "object", memberOptions?: OptionsBase, ): Map { - if (!(Array.isArray(sourceObject))) - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + const expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!this.isExpectedMapShape(sourceObject, expectedShape)) + { + const expectedType = expectedShape === MapShape.ARRAY ? Array : Object; + this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); + return new Map(); + } - if (!typeInfo.keyConstructor) + if (!typeDescriptor.keyType) { this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`)); return new Map(); } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) + if (!typeDescriptor.valueType) { this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`)); return new Map(); } - let keyTypeInfo: IScopeTypeInfo = { - selfConstructor: typeInfo.keyConstructor, - knownTypes: typeInfo.knownTypes - }; - - let valueTypeInfo: IScopeTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; + const resultMap = new Map(); - let resultMap = new Map(); - - sourceObject.forEach((element: any) => + if (expectedShape === MapShape.OBJECT) { - try - { - let key = this.convertSingleValue(element.key, keyTypeInfo, memberName, memberOptions); - - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) + Object.keys(sourceObject).forEach(key => { + try { - resultMap.set( + const resultKey = this.convertSingleValue( key, - this.convertSingleValue( - element.value, - valueTypeInfo, - `${memberName}[${key}]`, - memberOptions, - ), + typeDescriptor.keyType, + knownTypes, + memberName, + memberOptions, + ); + if (isValueDefined(resultKey)) + { + resultMap.set( + resultKey, + this.convertSingleValue( + sourceObject[key], + typeDescriptor.valueType, + knownTypes, + `${memberName}[${resultKey}]`, + memberOptions, + ), + ); + } + } + catch (e) + { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + this._errorHandler(e); + } + }) + } + else + { + sourceObject.forEach((element: any) => { + try + { + const key = this.convertSingleValue( + element.key, + typeDescriptor.keyType, + knownTypes, + memberName, + memberOptions, ); + + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) + { + resultMap.set( + key, + this.convertSingleValue( + element.value, + typeDescriptor.valueType, + knownTypes, + `${memberName}[${key}]`, + memberOptions, + ), + ); + } } - } - catch (e) - { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - this._errorHandler(e); - } - }); + catch (e) + { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + this._errorHandler(e); + } + }); + } return resultMap; } @@ -619,7 +662,13 @@ export class Deserializer return new DataView(this._stringToArrayBuffer(str)); } - private retrievePreserveNull(memberOptions?: OptionsBase): boolean { + private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { + return (expectedShape === MapShape.ARRAY && Array.isArray(source)) + || (expectedShape === MapShape.OBJECT && typeof source === "object"); + } + + private retrievePreserveNull(memberOptions?: OptionsBase): boolean + { return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); } } diff --git a/src/typedjson/json-array-member.ts b/src/typedjson/json-array-member.ts index 0f356ed..3167013 100644 --- a/src/typedjson/json-array-member.ts +++ b/src/typedjson/json-array-member.ts @@ -1,6 +1,12 @@ import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from "./helpers"; import { injectMetadataInformation } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; +import { + ArrayTypeDescriptor, + ensureTypeDescriptor, + isTypelike, + TypeDescriptor, +} from "./type-descriptor"; declare abstract class Reflect { @@ -33,13 +39,13 @@ export interface IJsonArrayMemberOptions extends OptionsBase * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). * @param options Additional options. */ -export function jsonArrayMember(elementConstructor: Function, options: IJsonArrayMemberOptions = {}) +export function jsonArrayMember(elementConstructor: Function|TypeDescriptor, options: IJsonArrayMemberOptions = {}) { return (target: Object, propKey: string | symbol) => { - let decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. + const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (typeof elementConstructor !== "function") + if (!isTypelike(elementConstructor)) { logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`); return; @@ -60,8 +66,7 @@ export function jsonArrayMember(elementConstructor: Function, options: IJsonArra } injectMetadataInformation(target, propKey, { - ctor: Array, - elementType: createArrayElementType(elementConstructor, dimensions), + type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), @@ -73,8 +78,10 @@ export function jsonArrayMember(elementConstructor: Function, options: IJsonArra }; } -function createArrayElementType(elementCtor: Function, dimensions: number) { - const elementTypes = new Array(dimensions).fill(Array, 0, -1); - elementTypes[dimensions-1] = elementCtor; - return elementTypes; +export function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor { + let type = new ArrayTypeDescriptor(elementType); + for (let i = 1; i < dimensions; ++i) { + type = new ArrayTypeDescriptor(type); + } + return type; } diff --git a/src/typedjson/json-map-member.ts b/src/typedjson/json-map-member.ts index bf0d9e3..824a0e8 100644 --- a/src/typedjson/json-map-member.ts +++ b/src/typedjson/json-map-member.ts @@ -1,13 +1,14 @@ import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from "./helpers"; import { injectMetadataInformation } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; +import { isTypelike, MapOptions, MapT, TypeDescriptor } from "./type-descriptor"; declare abstract class Reflect { public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export interface IJsonMapMemberOptions extends OptionsBase +export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -32,19 +33,22 @@ export interface IJsonMapMemberOptions extends OptionsBase * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). * @param options Additional options. */ -export function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options: IJsonMapMemberOptions = {}) -{ +export function jsonMapMember( + keyConstructor: Function|TypeDescriptor, + valueConstructor: Function|TypeDescriptor, + options: IJsonMapMemberOptions = {}, +) { return (target: Object, propKey: string | symbol) => { - let decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. + const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (typeof keyConstructor !== "function") + if (!isTypelike(keyConstructor)) { logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`); return; } - if (typeof valueConstructor !== "function") + if (!isTypelike(valueConstructor)) { logError(`${decoratorName}: could not resolve constructor of map values at runtime.`); return; @@ -58,9 +62,7 @@ export function jsonMapMember(keyConstructor: Function, valueConstructor: Functi } injectMetadataInformation(target, propKey, { - ctor: Map, - elementType: [valueConstructor], - keyType: keyConstructor, + type: MapT(keyConstructor, valueConstructor, {shape: options.shape}), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index ab65a89..da011e9 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -3,6 +3,12 @@ } from "./helpers"; import { injectMetadataInformation } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; +import { + ArrayTypeDescriptor, + ConcreteTypeDescriptor, + ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, + TypeDescriptor, +} from "./type-descriptor"; declare abstract class Reflect { @@ -15,7 +21,7 @@ export interface IJsonMemberOptions extends OptionsBase * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function; + constructor?: Function|TypeDescriptor; /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -66,13 +72,14 @@ export function jsonMember(optionsOrTarget?: IJsonMe return; } - if (isSpecialPropertyType(decoratorName, reflectPropCtor)) + const typeDescriptor = ensureTypeDescriptor(reflectPropCtor); + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, propKey, { - ctor: reflectPropCtor, + type: typeDescriptor, key: propKey.toString(), name: propKey.toString(), }); @@ -89,7 +96,7 @@ export function jsonMember(optionsOrTarget?: IJsonMe return (target: Object, _propKey: string | symbol) => { let options: IJsonMemberOptions = optionsOrTarget || {}; - let propCtor: Function|undefined; + let typeDescriptor: TypeDescriptor|undefined; let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages. if (options.hasOwnProperty("constructor")) @@ -101,25 +108,25 @@ export function jsonMember(optionsOrTarget?: IJsonMe } // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. - if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata("design:type", target, _propKey))) + typeDescriptor = ensureTypeDescriptor(options.constructor); + if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata("design:type", target, _propKey))) { logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`); } - - propCtor = options.constructor; } else { // Use ReflectDecorators to obtain property constructor. if (isReflectMetadataSupported) { - propCtor = Reflect.getMetadata("design:type", target, _propKey) as Function; + const reflectCtor = Reflect.getMetadata("design:type", target, _propKey) as Function; - if (!propCtor) + if (!reflectCtor) { logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`); return; } + typeDescriptor = ensureTypeDescriptor(reflectCtor); } else if (!options.deserializer) { @@ -128,13 +135,13 @@ export function jsonMember(optionsOrTarget?: IJsonMe } } - if (isSpecialPropertyType(decoratorName, propCtor)) + + if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } - injectMetadataInformation(target, _propKey, { - ctor: propCtor, + type: typeDescriptor, emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), @@ -147,23 +154,23 @@ export function jsonMember(optionsOrTarget?: IJsonMe } } -function isSpecialPropertyType(decoratorName: string, propCtor?: Function) +function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor) { - if (propCtor === Array) + if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to` + ` serialize this property.`); return true; } - if (propCtor === Set) + if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to` + ` serialize this property.`); return true; } - if (propCtor === Map) + if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to` + ` serialize this property.`); diff --git a/src/typedjson/json-set-member.ts b/src/typedjson/json-set-member.ts index e808e4b..09ac838 100644 --- a/src/typedjson/json-set-member.ts +++ b/src/typedjson/json-set-member.ts @@ -1,6 +1,7 @@ import { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from "./helpers"; import { injectMetadataInformation } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; +import { isTypelike, SetT } from "./type-descriptor"; declare abstract class Reflect { @@ -37,7 +38,7 @@ export function jsonSetMember(elementConstructor: Function, options: IJsonSetMem { const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (typeof elementConstructor !== "function") + if (!isTypelike(elementConstructor)) { logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`); return; @@ -51,8 +52,7 @@ export function jsonSetMember(elementConstructor: Function, options: IJsonSetMem } injectMetadataInformation(target, propKey, { - ctor: Set, - elementType: [elementConstructor], + type: SetT(elementConstructor), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index f0d15b0..462a122 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -1,6 +1,7 @@ import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from "./helpers"; import { IndexedObject } from "./types"; import { OptionsBase } from "./options-base"; +import { TypeDescriptor } from "./type-descriptor"; export interface JsonMemberMetadata { @@ -14,19 +15,13 @@ export interface JsonMemberMetadata key: string; /** Constuctor (type) reference of the member. */ - ctor?: Function; + type?: TypeDescriptor; /** If set, indicates that the member must be present when deserializing. */ isRequired?: boolean; options?: OptionsBase; - /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */ - elementType?: Function[]; - - /** If the json member is a map, sets member options of array keys. */ - keyType?: Function; - /** Custom deserializer to use. */ deserializer?: (json: any) => any; @@ -160,9 +155,9 @@ export function injectMetadataInformation(constructor: IndexedObject, propKey: s return; } - if (!metadata || (!metadata.ctor && !metadata.deserializer)) + if (!metadata || (!metadata.type && !metadata.deserializer)) { - logError(`${decoratorName}: JsonMemberMetadata has unknown ctor.`); + logError(`${decoratorName}: JsonMemberMetadata has unknown type.`); return; } @@ -197,15 +192,9 @@ export function injectMetadataInformation(constructor: IndexedObject, propKey: s if (!metadata.deserializer) { // @ts-ignore above is a check (!deser && !ctor) - objectMetadata.knownTypes.add(metadata.ctor); + metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor)); } - if (metadata.keyType) - objectMetadata.knownTypes.add(metadata.keyType); - - if (metadata.elementType) - metadata.elementType.forEach(elemCtor => objectMetadata.knownTypes.add(elemCtor)); - // clear metadata of undefined properties to save memory (Object.keys(metadata) as [keyof JsonMemberMetadata]) .forEach((key) => (metadata[key] === undefined) && delete metadata[key]); diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 5ccb41e..1968c67 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -9,44 +9,14 @@ import { IndexedObject } from "./types"; import { JsonObjectMetadata } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; - -export interface IScopeTypeInfo -{ - selfType: Function; - elementTypes?: Function[]; - keyType?: Function; -} - -export interface IScopeArrayTypeInfo extends IScopeTypeInfo -{ - selfType: new () => Array; - elementTypes: Function[]; -} - -function isArrayTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeArrayTypeInfo { - return typeInfo.selfType === Array; -} - -export interface IScopeSetTypeInfo extends IScopeTypeInfo -{ - selfType: new () => Set; - elementTypes: [Function]; -} - -function isSetTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeSetTypeInfo { - return typeInfo.selfType === Set; -} - -export interface IScopeMapTypeInfo extends IScopeTypeInfo -{ - selfType: new () => Map; - elementTypes: [Function]; - keyType: Function; -} - -function isMapTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeMapTypeInfo { - return typeInfo.selfType === Map; -} +import { + ArrayTypeDescriptor, + ConcreteTypeDescriptor, + MapShape, + MapTypeDescriptor, + SetTypeDescriptor, + TypeDescriptor, +} from "./type-descriptor"; export type TypeHintEmitter = ( @@ -115,16 +85,16 @@ export class Serializer */ public convertSingleValue( sourceObject: any, - typeInfo: IScopeTypeInfo, + typeDescriptor: TypeDescriptor, memberName: string = "object", memberOptions?: OptionsBase, ): any { if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null; if (!isValueDefined(sourceObject)) return; - if (!isInstanceOf(sourceObject, typeInfo.selfType)) + if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { - let expectedName = nameof(typeInfo.selfType); + let expectedName = nameof(typeDescriptor.ctor); let actualName = nameof(sourceObject.constructor); this._errorHandler(new TypeError( @@ -133,37 +103,37 @@ export class Serializer return; } - if (isDirectlySerializableNativeType(typeInfo.selfType)) + if (isDirectlySerializableNativeType(typeDescriptor.ctor)) { return sourceObject; } - else if (typeInfo.selfType === ArrayBuffer) + else if (typeDescriptor.ctor === ArrayBuffer) { return this.convertAsArrayBuffer(sourceObject); } - else if (typeInfo.selfType === DataView) + else if (typeDescriptor.ctor === DataView) { return this.convertAsDataView(sourceObject); } - else if (isArrayTypeInfo(typeInfo)) + else if (typeDescriptor instanceof ArrayTypeDescriptor) { - return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName, memberOptions); + return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isSetTypeInfo(typeInfo)) + else if (typeDescriptor instanceof SetTypeDescriptor) { - return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions); + return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isMapTypeInfo(typeInfo)) + else if (typeDescriptor instanceof MapTypeDescriptor) { - return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions); + return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isTypeTypedArray(typeInfo.selfType)) + else if (isTypeTypedArray(typeDescriptor.ctor)) { return this.convertAsTypedArray(sourceObject); } else if (typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions); } } @@ -173,14 +143,14 @@ export class Serializer */ public convertAsObject( sourceObject: IndexedObject, - typeInfo: IScopeTypeInfo, + typeDescriptor: ConcreteTypeDescriptor, memberName?: string, memberOptions?: OptionsBase, ) { let sourceTypeMetadata: JsonObjectMetadata|undefined; let targetObject: IndexedObject; - if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType) + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { // The source object is not of the expected type, but it is a valid subtype. // This is OK, and we'll proceed to gather object metadata from the subtype instead. @@ -188,7 +158,7 @@ export class Serializer } else { - sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeInfo.selfType); + sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } if (sourceTypeMetadata) @@ -228,14 +198,10 @@ export class Serializer let serialized; if (objMemberMetadata.serializer) { serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } else if (objMemberMetadata.ctor) { + } else if (objMemberMetadata.type) { serialized = this.convertSingleValue( sourceObject[objMemberMetadata.key], - { - selfType: objMemberMetadata.ctor, - elementTypes: objMemberMetadata.elementType, - keyType: objMemberMetadata.keyType, - }, + objMemberMetadata.type, `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`, objMemberOptions, ); @@ -261,7 +227,7 @@ export class Serializer } // Add type-hint. - this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata); + this._typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); return targetObject; } @@ -269,18 +235,19 @@ export class Serializer /** * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for * serialization. - * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions. * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ public convertAsArray( sourceObject: any[], - expectedElementType: Function[], + typeDescriptor: ArrayTypeDescriptor, memberName = "object", memberOptions?: OptionsBase, ): any[] { - if (expectedElementType.length === 0 || !expectedElementType[0]) - throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); + if (!typeDescriptor.elementType) + { + throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); + } // Check the type of each element, individually. // If at least one array element type is incorrect, we return undefined, which results in no @@ -290,21 +257,15 @@ export class Serializer sourceObject.forEach((element, i) => { if (!(this.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, expectedElementType[0]) + && !isInstanceOf(element, typeDescriptor.elementType.ctor) ) { - const expectedTypeName = nameof(expectedElementType[0]); + const expectedTypeName = nameof(typeDescriptor.elementType.ctor); const actualTypeName = element && nameof(element.constructor); throw new TypeError(`Could not serialize ${memberName}[${i}]:` + ` expected '${expectedTypeName}', got '${actualTypeName}'.`); } }); - const typeInfoForElements: IScopeTypeInfo = { - selfType: expectedElementType[0], - // For multidimensional arrays. - elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], - }; - if (memberName) { // Just for debugging purposes. @@ -313,7 +274,7 @@ export class Serializer return sourceObject.map( element => this.convertSingleValue( - element, typeInfoForElements, memberName, memberOptions + element, typeDescriptor.elementType, memberName, memberOptions ), ); } @@ -331,19 +292,20 @@ export class Serializer */ public convertAsSet( sourceObject: Set, - expectedElementType: Function, + typeDescriptor: SetTypeDescriptor, memberName = "object", memberOptions?: OptionsBase, ): any[] { - if (!expectedElementType) + if (!typeDescriptor.elementType) + { throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`); - - let elementTypeInfo: IScopeTypeInfo = { - selfType: expectedElementType, - }; + } // For debugging and error tracking. - if (memberName) memberName += "[]"; + if (memberName) + { + memberName += "[]"; + } let resultArray: any[] = []; @@ -352,7 +314,7 @@ export class Serializer // (TODO: clarification needed) sourceObject.forEach(element => { - let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions); + const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); // Add to output if the source element was undefined, OR the converted element is defined. // This will add intentionally undefined values to output, but not values that became undefined @@ -371,46 +333,41 @@ export class Serializer * of simple javascript objects with `key` and `value` properties. * * @param sourceObject - * @param expectedKeyType The constructor of the expected Map keys - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). - * @param expectedElementType The constructor of the expected Map values - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ public convertAsMap( sourceObject: Map, - expectedKeyType: Function, - expectedElementType: Function, + typeDescriptor: MapTypeDescriptor, memberName = "object", memberOptions?: OptionsBase, - ): Array<{ key: any, value: any }> { - if (!expectedElementType) + ): IndexedObject|Array<{ key: any, value: any }> { + if (!typeDescriptor.valueType) + { throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); + } - if (!expectedKeyType) + if (!typeDescriptor.keyType) + { throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`); + } - let elementTypeInfo: IScopeTypeInfo = { - selfType: expectedElementType, - elementTypes: [expectedElementType] - }; - - let keyTypeInfo: IScopeTypeInfo = { - selfType: expectedKeyType - }; - - if (memberName) memberName += "[]"; + if (memberName) + { + memberName += "[]"; + } - const resultArray: Array<{ key: any, value: any }> = []; + // const resultArray: Array<{ key: any, value: any }> = []; + const resultShape = typeDescriptor.getCompleteOptions().shape; + const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : []; const preserveNull = this.retrievePreserveNull(memberOptions); // Convert each *entry* in the map to a simple javascript object with key and value properties. sourceObject.forEach((value, key) => { let resultKeyValuePairObj = { - key: this.convertSingleValue(key, keyTypeInfo, memberName, memberOptions), - value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions), + key: this.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), }; // We are not going to emit entries with undefined keys OR undefined values. @@ -419,11 +376,15 @@ export class Serializer || (resultKeyValuePairObj.value === null && preserveNull); if (keyDefined && valueDefined) { - resultArray.push(resultKeyValuePairObj); + if (resultShape === MapShape.OBJECT) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; + } else { + result.push(resultKeyValuePairObj); + } } }); - return resultArray; + return result; } /** diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts new file mode 100644 index 0000000..f46c05a --- /dev/null +++ b/src/typedjson/type-descriptor.ts @@ -0,0 +1,115 @@ +export abstract class TypeDescriptor { + protected constructor(public readonly ctor: Function) {} + + getTypes(): Function[] { + return [this.ctor]; + } +} + +export type Typelike = TypeDescriptor|Function; + +export class ConcreteTypeDescriptor extends TypeDescriptor { + constructor(ctor: Function) { + super(ctor); + } +} + +export abstract class GenericTypeDescriptor extends TypeDescriptor { + protected constructor(ctor: Function) { + super(ctor); + } +} + +export class ArrayTypeDescriptor extends GenericTypeDescriptor { + constructor(public readonly elementType: TypeDescriptor) { + super(Array); + } + + getTypes(): Function[] { + return super.getTypes().concat(this.elementType.getTypes()); + } +} + +export function ArrayT(elementType: Typelike): ArrayTypeDescriptor { + return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType)); +} + +export class SetTypeDescriptor extends GenericTypeDescriptor { + constructor(public readonly elementType: TypeDescriptor) { + super(Set); + } + + getTypes(): Function[] { + return super.getTypes().concat(this.elementType.getTypes()); + } +} + +export function SetT(elementType: Typelike): SetTypeDescriptor { + return new SetTypeDescriptor(ensureTypeDescriptor(elementType)); +} + +export const enum MapShape { + /** + * A map will be serialized as an array of {key: ..., value: ...} objects. + */ + ARRAY, + + /** + * A map will be serialized as a JSON object. + */ + OBJECT, +} + +export interface MapOptions { + /** + * How the map should be serialized. Default is ARRAY. + */ + shape: MapShape; +} + +export class MapTypeDescriptor extends GenericTypeDescriptor { + constructor( + public readonly keyType: TypeDescriptor, + public readonly valueType: TypeDescriptor, + public readonly options?: Partial, + ) { + super(Map); + } + + getTypes(): Function[] { + return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes()); + } + + getCompleteOptions(): MapOptions { + return { + shape: this.options?.shape ? this.options.shape : MapShape.ARRAY, + }; + } +} + +export function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor { + return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); +} + +// TODO support for dictionary types ie. maps that are plain objects +// export class DictionaryTypeDescriptor extends GenericTypeDescriptor { +// constructor(public readonly elementType: TypeDescriptor) { +// super(Object); +// } +// +// getTypes(): Function[] { +// return super.getTypes().concat(this.elementType.getTypes()); +// } +// } +// +// export function DictT(elementType: Typelike): DictionaryTypeDescriptor { +// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); +// } + +export function isTypelike(type: any): type is Typelike { + return type && (typeof type === "function" || type instanceof TypeDescriptor); +} + +export function ensureTypeDescriptor(type: Typelike): TypeDescriptor { + return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); +} From b83d87f84f274dee1ad668030feaf9f64b244bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Wed, 15 Jul 2020 23:56:49 +0200 Subject: [PATCH 006/119] 1.6.0-rc1 --- js/parser.d.ts | 8 +- js/typedjson.d.ts | 1 + js/typedjson.js | 621 +++++++++++++++------------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 +- js/typedjson.min.js.map | 2 +- js/typedjson/deserializer.d.ts | 18 +- js/typedjson/json-array-member.d.ts | 4 +- js/typedjson/json-map-member.d.ts | 5 +- js/typedjson/json-member.d.ts | 3 +- js/typedjson/metadata.d.ts | 7 +- js/typedjson/serializer.d.ts | 34 +- js/typedjson/type-descriptor.d.ts | 51 +++ package-lock.json | 2 +- package.json | 2 +- 15 files changed, 426 insertions(+), 338 deletions(-) create mode 100644 js/typedjson/type-descriptor.d.ts diff --git a/js/parser.d.ts b/js/parser.d.ts index c60345a..8123df7 100644 --- a/js/parser.d.ts +++ b/js/parser.d.ts @@ -1,4 +1,4 @@ -import { Constructor } from "./typedjson/types"; +import { Constructor, IndexedObject } from "./typedjson/types"; import { TypeHintEmitter } from "./typedjson/serializer"; import { TypeResolver } from "./typedjson/deserializer"; import { OptionsBase } from "./typedjson/options-base"; @@ -51,7 +51,7 @@ export declare class TypedJSON { static toPlainArray(object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings): Object[][][][][]; static toPlainArray(object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings): any[]; static toPlainSet(object: Set, elementType: Constructor, settings?: ITypedJSONSettings): Object[] | undefined; - static toPlainMap(object: Map, keyCtor: Constructor, valueCtor: Constructor, settings?: ITypedJSONSettings): { + static toPlainMap(object: Map, keyCtor: Constructor, valueCtor: Constructor, settings?: ITypedJSONSettings): IndexedObject | { key: any; value: any; }[] | undefined; @@ -77,7 +77,7 @@ export declare class TypedJSON { /** * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object * instances of the specified root class type. - * @param rootType The constructor of the root class type. + * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings); @@ -113,7 +113,7 @@ export declare class TypedJSON { toPlainArray(object: T[][][][], dimensions: 4): Object[][][][]; toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][]; toPlainSet(object: Set): Object[] | undefined; - toPlainMap(object: Map, keyConstructor: Constructor): { + toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject | { key: any; value: any; }[] | undefined; diff --git a/js/typedjson.d.ts b/js/typedjson.d.ts index 307ab6b..ec14b16 100644 --- a/js/typedjson.d.ts +++ b/js/typedjson.d.ts @@ -5,3 +5,4 @@ export { jsonArrayMember } from "./typedjson/json-array-member"; export { jsonSetMember } from "./typedjson/json-set-member"; export { jsonMapMember } from "./typedjson/json-map-member"; export { toJson } from "./typedjson/to-json"; +export { ArrayT, SetT, MapT } from "./typedjson/type-descriptor"; diff --git a/js/typedjson.js b/js/typedjson.js index 154e2a4..a4a65a5 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.5.2 - 2020-07-12 +// [typedjson] Version: 1.6.0-rc1 - 2020-07-15 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -329,8 +329,8 @@ function injectMetadataInformation(constructor, propKey, metadata) { logError(decoratorName + ": cannot use a method property."); return; } - if (!metadata || (!metadata.ctor && !metadata.deserializer)) { - logError(decoratorName + ": JsonMemberMetadata has unknown ctor."); + if (!metadata || (!metadata.type && !metadata.deserializer)) { + logError(decoratorName + ": JsonMemberMetadata has unknown type."); return; } // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). @@ -358,12 +358,8 @@ function injectMetadataInformation(constructor, propKey, metadata) { } if (!metadata.deserializer) { // @ts-ignore above is a check (!deser && !ctor) - objectMetadata.knownTypes.add(metadata.ctor); + metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); } - if (metadata.keyType) - objectMetadata.knownTypes.add(metadata.keyType); - if (metadata.elementType) - metadata.elementType.forEach(function (elemCtor) { return objectMetadata.knownTypes.add(elemCtor); }); // clear metadata of undefined properties to save memory Object.keys(metadata) .forEach(function (key) { return (metadata[key] === undefined) && delete metadata[key]; }); @@ -402,6 +398,123 @@ function mergeOptions(existing, moreSpecific) { : Object.assign({}, existing, moreSpecific); } +// CONCATENATED MODULE: ./src/typedjson/type-descriptor.ts +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var TypeDescriptor = /** @class */ (function () { + function TypeDescriptor(ctor) { + this.ctor = ctor; + } + TypeDescriptor.prototype.getTypes = function () { + return [this.ctor]; + }; + return TypeDescriptor; +}()); + +var ConcreteTypeDescriptor = /** @class */ (function (_super) { + __extends(ConcreteTypeDescriptor, _super); + function ConcreteTypeDescriptor(ctor) { + return _super.call(this, ctor) || this; + } + return ConcreteTypeDescriptor; +}(TypeDescriptor)); + +var GenericTypeDescriptor = /** @class */ (function (_super) { + __extends(GenericTypeDescriptor, _super); + function GenericTypeDescriptor(ctor) { + return _super.call(this, ctor) || this; + } + return GenericTypeDescriptor; +}(TypeDescriptor)); + +var ArrayTypeDescriptor = /** @class */ (function (_super) { + __extends(ArrayTypeDescriptor, _super); + function ArrayTypeDescriptor(elementType) { + var _this = _super.call(this, Array) || this; + _this.elementType = elementType; + return _this; + } + ArrayTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); + }; + return ArrayTypeDescriptor; +}(GenericTypeDescriptor)); + +function ArrayT(elementType) { + return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType)); +} +var SetTypeDescriptor = /** @class */ (function (_super) { + __extends(SetTypeDescriptor, _super); + function SetTypeDescriptor(elementType) { + var _this = _super.call(this, Set) || this; + _this.elementType = elementType; + return _this; + } + SetTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); + }; + return SetTypeDescriptor; +}(GenericTypeDescriptor)); + +function SetT(elementType) { + return new SetTypeDescriptor(ensureTypeDescriptor(elementType)); +} +var MapTypeDescriptor = /** @class */ (function (_super) { + __extends(MapTypeDescriptor, _super); + function MapTypeDescriptor(keyType, valueType, options) { + var _this = _super.call(this, Map) || this; + _this.keyType = keyType; + _this.valueType = valueType; + _this.options = options; + return _this; + } + MapTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.keyType.getTypes(), this.valueType.getTypes()); + }; + MapTypeDescriptor.prototype.getCompleteOptions = function () { + var _a; + return { + shape: ((_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) ? this.options.shape : 0 /* ARRAY */, + }; + }; + return MapTypeDescriptor; +}(GenericTypeDescriptor)); + +function MapT(keyType, valueType, options) { + return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); +} +// TODO support for dictionary types ie. maps that are plain objects +// export class DictionaryTypeDescriptor extends GenericTypeDescriptor { +// constructor(public readonly elementType: TypeDescriptor) { +// super(Object); +// } +// +// getTypes(): Function[] { +// return super.getTypes().concat(this.elementType.getTypes()); +// } +// } +// +// export function DictT(elementType: Typelike): DictionaryTypeDescriptor { +// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); +// } +function isTypelike(type) { + return type && (typeof type === "function" || type instanceof TypeDescriptor); +} +function ensureTypeDescriptor(type) { + return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); +} + // CONCATENATED MODULE: ./src/typedjson/serializer.ts var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { @@ -417,15 +530,7 @@ var __assign = (undefined && undefined.__assign) || function () { -function isArrayTypeInfo(typeInfo) { - return typeInfo.selfType === Array; -} -function isSetTypeInfo(typeInfo) { - return typeInfo.selfType === Set; -} -function isMapTypeInfo(typeInfo) { - return typeInfo.selfType === Map; -} + function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { // 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 will know what to deserialize into (given @@ -467,58 +572,58 @@ var serializer_Serializer = /** @class */ (function () { * Convert a value of any supported serializable type. * The value type will be detected, and the correct serialization method will be called. */ - Serializer.prototype.convertSingleValue = function (sourceObject, typeInfo, memberName, memberOptions) { + Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { if (memberName === void 0) { memberName = "object"; } if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null; if (!isValueDefined(sourceObject)) return; - if (!isInstanceOf(sourceObject, typeInfo.selfType)) { - var expectedName = nameof(typeInfo.selfType); + if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { + var expectedName = nameof(typeDescriptor.ctor); var actualName = nameof(sourceObject.constructor); this._errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); return; } - if (isDirectlySerializableNativeType(typeInfo.selfType)) { + if (isDirectlySerializableNativeType(typeDescriptor.ctor)) { return sourceObject; } - else if (typeInfo.selfType === ArrayBuffer) { + else if (typeDescriptor.ctor === ArrayBuffer) { return this.convertAsArrayBuffer(sourceObject); } - else if (typeInfo.selfType === DataView) { + else if (typeDescriptor.ctor === DataView) { return this.convertAsDataView(sourceObject); } - else if (isArrayTypeInfo(typeInfo)) { - return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName, memberOptions); + else if (typeDescriptor instanceof ArrayTypeDescriptor) { + return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isSetTypeInfo(typeInfo)) { - return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions); + else if (typeDescriptor instanceof SetTypeDescriptor) { + return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isMapTypeInfo(typeInfo)) { - return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions); + else if (typeDescriptor instanceof MapTypeDescriptor) { + return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions); } - else if (isTypeTypedArray(typeInfo.selfType)) { + else if (isTypeTypedArray(typeDescriptor.ctor)) { return this.convertAsTypedArray(sourceObject); } else if (typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions); } }; /** * Performs the conversion of a typed object (usually a class instance) to a simple * javascript object for serialization. */ - Serializer.prototype.convertAsObject = function (sourceObject, typeInfo, memberName, memberOptions) { + Serializer.prototype.convertAsObject = function (sourceObject, typeDescriptor, memberName, memberOptions) { var _this = this; var sourceTypeMetadata; var targetObject; - if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType) { + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { // The source object is not of the expected type, but it is a valid subtype. // This is OK, and we'll proceed to gather object metadata from the subtype instead. sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); } else { - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeInfo.selfType); + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } if (sourceTypeMetadata) { if (sourceTypeMetadata.beforeSerializationMethodName) { @@ -547,12 +652,8 @@ var serializer_Serializer = /** @class */ (function () { if (objMemberMetadata.serializer) { serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); } - else if (objMemberMetadata.ctor) { - serialized = _this.convertSingleValue(sourceObject[objMemberMetadata.key], { - selfType: objMemberMetadata.ctor, - elementTypes: objMemberMetadata.elementType, - keyType: objMemberMetadata.keyType, - }, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + else if (objMemberMetadata.type) { + serialized = _this.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); } else { throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" @@ -570,21 +671,21 @@ var serializer_Serializer = /** @class */ (function () { targetObject = __assign({}, sourceObject); } // Add type-hint. - this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata); + this._typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); return targetObject; }; /** * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for * serialization. - * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions. * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ - Serializer.prototype.convertAsArray = function (sourceObject, expectedElementType, memberName, memberOptions) { + Serializer.prototype.convertAsArray = function (sourceObject, typeDescriptor, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } - if (expectedElementType.length === 0 || !expectedElementType[0]) + if (!typeDescriptor.elementType) { throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); + } // Check the type of each element, individually. // If at least one array element type is incorrect, we return undefined, which results in no // value emitted during serialization. This is so that invalid element types don't unexpectedly @@ -592,23 +693,18 @@ var serializer_Serializer = /** @class */ (function () { // the emitted array. sourceObject.forEach(function (element, i) { if (!(_this.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, expectedElementType[0])) { - var expectedTypeName = nameof(expectedElementType[0]); + && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { + var expectedTypeName = nameof(typeDescriptor.elementType.ctor); var actualTypeName = element && nameof(element.constructor); throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); } }); - var typeInfoForElements = { - selfType: expectedElementType[0], - // For multidimensional arrays. - elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], - }; if (memberName) { // Just for debugging purposes. memberName += "[]"; } - return sourceObject.map(function (element) { return _this.convertSingleValue(element, typeInfoForElements, memberName, memberOptions); }); + return sourceObject.map(function (element) { return _this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); }; /** * Performs the conversion of a set of typed objects (or primitive values) into an array @@ -621,23 +717,22 @@ var serializer_Serializer = /** @class */ (function () { * @param memberOptions If converted as a member, the member options. * @returns */ - Serializer.prototype.convertAsSet = function (sourceObject, expectedElementType, memberName, memberOptions) { + Serializer.prototype.convertAsSet = function (sourceObject, typeDescriptor, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } - if (!expectedElementType) + if (!typeDescriptor.elementType) { throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); - var elementTypeInfo = { - selfType: expectedElementType, - }; + } // For debugging and error tracking. - if (memberName) + if (memberName) { memberName += "[]"; + } var resultArray = []; // Convert each element of the set, and put it into an output array. // The output array is the one serialized, as JSON.stringify does not support Set serialization. // (TODO: clarification needed) sourceObject.forEach(function (element) { - var resultElement = _this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions); + var resultElement = _this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); // Add to output if the source element was undefined, OR the converted element is defined. // This will add intentionally undefined values to output, but not values that became undefined // DURING serializing (usually because of a type-error). @@ -652,46 +747,45 @@ var serializer_Serializer = /** @class */ (function () { * of simple javascript objects with `key` and `value` properties. * * @param sourceObject - * @param expectedKeyType The constructor of the expected Map keys - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). - * @param expectedElementType The constructor of the expected Map values - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ - Serializer.prototype.convertAsMap = function (sourceObject, expectedKeyType, expectedElementType, memberName, memberOptions) { + Serializer.prototype.convertAsMap = function (sourceObject, typeDescriptor, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } - if (!expectedElementType) + if (!typeDescriptor.valueType) { throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); - if (!expectedKeyType) + } + if (!typeDescriptor.keyType) { throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); - var elementTypeInfo = { - selfType: expectedElementType, - elementTypes: [expectedElementType] - }; - var keyTypeInfo = { - selfType: expectedKeyType - }; - if (memberName) + } + if (memberName) { memberName += "[]"; - var resultArray = []; + } + // const resultArray: Array<{ key: any, value: any }> = []; + var resultShape = typeDescriptor.getCompleteOptions().shape; + var result = resultShape === 1 /* OBJECT */ ? {} : []; var preserveNull = this.retrievePreserveNull(memberOptions); // Convert each *entry* in the map to a simple javascript object with key and value properties. sourceObject.forEach(function (value, key) { var resultKeyValuePairObj = { - key: _this.convertSingleValue(key, keyTypeInfo, memberName, memberOptions), - value: _this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions), + key: _this.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: _this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), }; // We are not going to emit entries with undefined keys OR undefined values. var keyDefined = isValueDefined(resultKeyValuePairObj.key); var valueDefined = isValueDefined(resultKeyValuePairObj.value) || (resultKeyValuePairObj.value === null && preserveNull); if (keyDefined && valueDefined) { - resultArray.push(resultKeyValuePairObj); + if (resultShape === 1 /* OBJECT */) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; + } + else { + result.push(resultKeyValuePairObj); + } } }); - return resultArray; + return result; }; /** * Performs the conversion of a typed javascript array to a simple untyped javascript array. @@ -729,6 +823,7 @@ var serializer_Serializer = /** @class */ (function () { + function defaultTypeResolver(sourceObject, knownTypes) { if (sourceObject.__type) return knownTypes.get(sourceObject.__type); @@ -757,16 +852,16 @@ var deserializer_Deserializer = /** @class */ (function () { } this._errorHandler = errorHandlerCallback; }; - Deserializer.prototype.convertAsObject = function (sourceObject, sourceObjectTypeInfo, objectName, memberOptions) { + Deserializer.prototype.convertAsObject = function (sourceObject, typeDescriptor, knownTypes, objectName, memberOptions) { var _this = this; if (objectName === void 0) { objectName = "object"; } if (typeof sourceObject !== "object" || sourceObject === null) { this._errorHandler(new TypeError("Cannot deserialize " + objectName + ": 'sourceObject' must be a defined object.")); return undefined; } - var expectedSelfType = sourceObjectTypeInfo.selfConstructor; + var expectedSelfType = typeDescriptor.ctor; var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); - var knownTypeConstructors = sourceObjectTypeInfo.knownTypes; + var knownTypeConstructors = knownTypes; if (sourceObjectMetadata) { // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = this._mergeKnownTypes(knownTypeConstructors, this._createKnownTypesMap(sourceObjectMetadata.knownTypes)); @@ -800,13 +895,8 @@ var deserializer_Deserializer = /** @class */ (function () { if (objMemberMetadata.deserializer) { revivedValue = objMemberMetadata.deserializer(objMemberValue); } - else if (objMemberMetadata.ctor) { - revivedValue = _this.convertSingleValue(objMemberValue, { - selfConstructor: objMemberMetadata.ctor, - elementConstructor: objMemberMetadata.elementType, - keyConstructor: objMemberMetadata.keyType, - knownTypes: knownTypeConstructors - }, objMemberDebugName, objMemberOptions); + else if (objMemberMetadata.type) { + revivedValue = _this.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); } else { throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" @@ -869,19 +959,14 @@ var deserializer_Deserializer = /** @class */ (function () { // Untyped deserialization into Object instance. var targetObject_1 = {}; Object.keys(sourceObject).forEach(function (sourceKey) { - targetObject_1[sourceKey] = _this.convertSingleValue(sourceObject[sourceKey], { - selfConstructor: sourceObject[sourceKey].constructor, - knownTypes: sourceObjectTypeInfo.knownTypes, - elementConstructor: sourceObjectTypeInfo.elementConstructor, - keyConstructor: sourceObjectTypeInfo.keyConstructor - }, sourceKey); + targetObject_1[sourceKey] = _this.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); }); return targetObject_1; } }; - Deserializer.prototype.convertSingleValue = function (sourceObject, typeInfo, memberName, memberOptions) { + Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { if (memberName === void 0) { memberName = "object"; } - var expectedSelfType = typeInfo.selfConstructor; + var expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor; var srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : "undefined"; if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { return null; @@ -889,15 +974,15 @@ var deserializer_Deserializer = /** @class */ (function () { else if (!isValueDefined(sourceObject)) { return; } - else if (isDirectlyDeserializableNativeType(expectedSelfType)) { - if (sourceObject.constructor === expectedSelfType) { + else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor)) { + if (sourceObject.constructor === typeDescriptor.ctor) { return sourceObject; } else { - throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName)); + throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName)); } } - else if (expectedSelfType === Date) { + else if (expectedTypeIsConcrete && typeDescriptor.ctor === Date) { // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) @@ -907,72 +992,69 @@ var deserializer_Deserializer = /** @class */ (function () { else this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array) { + else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array)) { // Deserialize Float Array from number[]. - return this._convertAsFloatArray(sourceObject, expectedSelfType, srcTypeNameForDebug, memberName); + return this._convertAsFloatArray(sourceObject, typeDescriptor, srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Uint8Array - || expectedSelfType === Uint8ClampedArray - || expectedSelfType === Uint16Array - || expectedSelfType === Uint32Array) { + else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Uint8Array + || typeDescriptor.ctor === Uint8ClampedArray + || typeDescriptor.ctor === Uint16Array + || typeDescriptor.ctor === Uint32Array)) { // Deserialize Uint array from number[]. - return this._convertAsUintArray(sourceObject, expectedSelfType, srcTypeNameForDebug, memberName); + return this._convertAsUintArray(sourceObject, typeDescriptor.ctor, srcTypeNameForDebug, memberName); } - else if (expectedSelfType === ArrayBuffer) { + else if (expectedTypeIsConcrete && typeDescriptor.ctor === ArrayBuffer) { if (typeof sourceObject === "string") return this._stringToArrayBuffer(sourceObject); else this._throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === DataView) { + else if (expectedTypeIsConcrete && typeDescriptor.ctor === DataView) { if (typeof sourceObject === "string") return this._stringToDataView(sourceObject); else this._throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Array) { + else if (typeDescriptor instanceof ArrayTypeDescriptor) { if (Array.isArray(sourceObject)) - return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); else throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)); } - else if (expectedSelfType === Set) { + else if (typeDescriptor instanceof SetTypeDescriptor) { if (Array.isArray(sourceObject)) - return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); else this._throwTypeMismatchError("Set", "Array", srcTypeNameForDebug, memberName); } - else if (expectedSelfType === Map) { - if (Array.isArray(sourceObject)) - return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions); - else + else if (typeDescriptor instanceof MapTypeDescriptor) { + if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape)) { + return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); + } + else { this._throwTypeMismatchError("Map", "a source array of key-value-pair objects", srcTypeNameForDebug, memberName); + } } else if (sourceObject && typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeInfo, memberName, memberOptions); + return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); } }; - Deserializer.prototype.convertAsArray = function (sourceObject, typeInfo, memberName, memberOptions) { + Deserializer.prototype.convertAsArray = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } if (!(Array.isArray(sourceObject))) { this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return []; } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) { + if (!typeDescriptor.elementType) { this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); return []; } - var elementTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; return sourceObject.map(function (element) { // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty // entries, as an Array is ordered. try { - return _this.convertSingleValue(element, elementTypeInfo, memberName + "[]", memberOptions); + return _this.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); } catch (e) { _this._errorHandler(e); @@ -982,26 +1064,21 @@ var deserializer_Deserializer = /** @class */ (function () { } }); }; - Deserializer.prototype.convertAsSet = function (sourceObject, typeInfo, memberName, memberOptions) { + Deserializer.prototype.convertAsSet = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } if (!(Array.isArray(sourceObject))) { this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return new Set(); } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) { + if (!typeDescriptor.elementType) { this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); return new Set(); } - var elementTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; var resultSet = new Set(); sourceObject.forEach(function (element, i) { try { - resultSet.add(_this.convertSingleValue(element, elementTypeInfo, memberName + "[" + i + "]", memberOptions)); + resultSet.add(_this.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); } catch (e) { // Faulty entries are skipped, because a Set is not ordered, and skipping an entry @@ -1011,43 +1088,55 @@ var deserializer_Deserializer = /** @class */ (function () { }); return resultSet; }; - Deserializer.prototype.convertAsMap = function (sourceObject, typeInfo, memberName, memberOptions) { + Deserializer.prototype.convertAsMap = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { var _this = this; if (memberName === void 0) { memberName = "object"; } - if (!(Array.isArray(sourceObject))) - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - if (!typeInfo.keyConstructor) { + var expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!this.isExpectedMapShape(sourceObject, expectedShape)) { + var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; + this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); + return new Map(); + } + if (!typeDescriptor.keyType) { this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); return new Map(); } - if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length) { + if (!typeDescriptor.valueType) { this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); return new Map(); } - var keyTypeInfo = { - selfConstructor: typeInfo.keyConstructor, - knownTypes: typeInfo.knownTypes - }; - var valueTypeInfo = { - selfConstructor: typeInfo.elementConstructor[0], - elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [], - knownTypes: typeInfo.knownTypes - }; var resultMap = new Map(); - sourceObject.forEach(function (element) { - try { - var key = _this.convertSingleValue(element.key, keyTypeInfo, memberName, memberOptions); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) { - resultMap.set(key, _this.convertSingleValue(element.value, valueTypeInfo, memberName + "[" + key + "]", memberOptions)); + if (expectedShape === 1 /* OBJECT */) { + Object.keys(sourceObject).forEach(function (key) { + try { + var resultKey = _this.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + if (isValueDefined(resultKey)) { + resultMap.set(resultKey, _this.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); + } } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - _this._errorHandler(e); - } - }); + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + _this._errorHandler(e); + } + }); + } + else { + sourceObject.forEach(function (element) { + try { + var key = _this.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) { + resultMap.set(key, _this.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + _this._errorHandler(e); + } + }); + } return resultMap; }; Deserializer.prototype._convertAsFloatArray = function (sourceObject, arrayType, srcTypeNameForDebug, memberName) { @@ -1119,6 +1208,10 @@ var deserializer_Deserializer = /** @class */ (function () { Deserializer.prototype._stringToDataView = function (str) { return new DataView(this._stringToArrayBuffer(str)); }; + Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === "object"); + }; Deserializer.prototype.retrievePreserveNull = function (memberOptions) { return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); }; @@ -1126,6 +1219,54 @@ var deserializer_Deserializer = /** @class */ (function () { }()); +// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts + + + + +/** + * Specifies that a property, of type array, is part of an object when serializing. + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). + * @param options Additional options. + */ +function jsonArrayMember(elementConstructor, options) { + if (options === void 0) { options = {}; } + return function (target, propKey) { + var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. + if (!isTypelike(elementConstructor)) { + logError(decoratorName + ": could not resolve constructor of array elements at runtime."); + return; + } + var dimensions = options.dimensions === undefined ? 1 : options.dimensions; + if (!isNaN(dimensions) && dimensions < 1) { + logError(decoratorName + ": 'dimensions' option must be at least 1."); + return; + } + // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. + if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Array) { + logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); + return; + } + injectMetadataInformation(target, propKey, { + type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: propKey.toString(), + name: options.name || propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; +} +function createArrayType(elementType, dimensions) { + var type = new ArrayTypeDescriptor(elementType); + for (var i = 1; i < dimensions; ++i) { + type = new ArrayTypeDescriptor(type); + } + return type; +} + // CONCATENATED MODULE: ./src/parser.ts var parser_assign = (undefined && undefined.__assign) || function () { parser_assign = Object.assign || function(t) { @@ -1143,11 +1284,13 @@ var parser_assign = (undefined && undefined.__assign) || function () { + + var parser_TypedJSON = /** @class */ (function () { /** * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object * instances of the specified root class type. - * @param rootType The constructor of the root class type. + * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ function TypedJSON(rootConstructor, settings) { @@ -1280,10 +1423,7 @@ var parser_TypedJSON = /** @class */ (function () { }); } try { - result = this.deserializer.convertSingleValue(json, { - selfConstructor: this.rootConstructor, - knownTypes: knownTypes, - }); + result = this.deserializer.convertSingleValue(json, ensureTypeDescriptor(this.rootConstructor), knownTypes); } catch (e) { this.errorHandler(e); @@ -1293,53 +1433,15 @@ var parser_TypedJSON = /** @class */ (function () { TypedJSON.prototype.parseAsArray = function (object, dimensions) { if (dimensions === void 0) { dimensions = 1; } var json = parseToJSObject(object, Array); - if (json instanceof Array) { - return this.deserializer.convertAsArray(json, { - selfConstructor: Array, - elementConstructor: new Array(dimensions - 1) - .fill(Array) - .concat(this.rootConstructor), - knownTypes: this._mapKnownTypes(this.globalKnownTypes), - }); - } - else { - this.errorHandler(new TypeError("Expected 'json' to define an Array" - + (", but got " + typeof json + "."))); - } - return []; + return this.deserializer.convertAsArray(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); }; TypedJSON.prototype.parseAsSet = function (object) { var json = parseToJSObject(object, Set); - // A Set is serialized as T[]. - if (json instanceof Array) { - return this.deserializer.convertAsSet(json, { - selfConstructor: Array, - elementConstructor: [this.rootConstructor], - knownTypes: this._mapKnownTypes(this.globalKnownTypes) - }); - } - else { - this.errorHandler(new TypeError("Expected 'json' to define a Set (using an Array)" - + (", but got " + typeof json + "."))); - } - return new Set(); + return this.deserializer.convertAsSet(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); }; TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { var json = parseToJSObject(object, Map); - // A Set is serialized as T[]. - if (json instanceof Array) { - return this.deserializer.convertAsMap(json, { - selfConstructor: Array, - elementConstructor: [this.rootConstructor], - knownTypes: this._mapKnownTypes(this.globalKnownTypes), - keyConstructor: keyConstructor - }); - } - else { - this.errorHandler(new TypeError("Expected 'json' to define a Set (using an Array)" - + (", but got " + typeof json + "."))); - } - return new Map(); + return this.deserializer.convertAsMap(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); }; /** * Converts an instance of the specified class type to a plain JSON object. @@ -1348,7 +1450,7 @@ var parser_TypedJSON = /** @class */ (function () { */ TypedJSON.prototype.toPlainJson = function (object) { try { - return this.serializer.convertSingleValue(object, { selfType: this.rootConstructor }); + return this.serializer.convertSingleValue(object, ensureTypeDescriptor(this.rootConstructor)); } catch (e) { this.errorHandler(e); @@ -1357,8 +1459,7 @@ var parser_TypedJSON = /** @class */ (function () { TypedJSON.prototype.toPlainArray = function (object, dimensions) { if (dimensions === void 0) { dimensions = 1; } try { - var elementConstructorArray = new Array(dimensions - 1).fill(Array).concat(this.rootConstructor); - return this.serializer.convertAsArray(object, elementConstructorArray); + return this.serializer.convertAsArray(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); } catch (e) { this.errorHandler(e); @@ -1366,7 +1467,7 @@ var parser_TypedJSON = /** @class */ (function () { }; TypedJSON.prototype.toPlainSet = function (object) { try { - return this.serializer.convertAsSet(object, this.rootConstructor); + return this.serializer.convertAsSet(object, SetT(this.rootConstructor)); } catch (e) { this.errorHandler(e); @@ -1374,7 +1475,7 @@ var parser_TypedJSON = /** @class */ (function () { }; TypedJSON.prototype.toPlainMap = function (object, keyConstructor) { try { - return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor); + return this.serializer.convertAsMap(object, MapT(keyConstructor, this.rootConstructor)); } catch (e) { this.errorHandler(e); @@ -1492,6 +1593,7 @@ function jsonObject(optionsOrTarget) { + function jsonMember(optionsOrTarget, propKey) { if (optionsOrTarget instanceof Object && (typeof propKey === "string" || typeof propKey === "symbol")) { var target = optionsOrTarget; @@ -1505,11 +1607,12 @@ function jsonMember(optionsOrTarget, propKey) { logError(decoratorName + ": could not resolve detected property constructor at runtime. " + MISSING_REFLECT_CONF_MSG); return; } - if (isSpecialPropertyType(decoratorName, reflectPropCtor)) { + var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, propKey, { - ctor: reflectPropCtor, + type: typeDescriptor, key: propKey.toString(), name: propKey.toString(), }); @@ -1523,7 +1626,7 @@ function jsonMember(optionsOrTarget, propKey) { // jsonMember used as a decorator factory. return function (target, _propKey) { var options = optionsOrTarget || {}; - var propCtor; + var typeDescriptor; var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); // For error messages. if (options.hasOwnProperty("constructor")) { if (!isValueDefined(options.constructor)) { @@ -1531,30 +1634,31 @@ function jsonMember(optionsOrTarget, propKey) { return; } // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. - if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata("design:type", target, _propKey))) { + typeDescriptor = ensureTypeDescriptor(options.constructor); + if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata("design:type", target, _propKey))) { logWarning(decoratorName + ": detected property type does not match 'constructor' option."); } - propCtor = options.constructor; } else { // Use ReflectDecorators to obtain property constructor. if (isReflectMetadataSupported) { - propCtor = Reflect.getMetadata("design:type", target, _propKey); - if (!propCtor) { + var reflectCtor = Reflect.getMetadata("design:type", target, _propKey); + if (!reflectCtor) { logError(decoratorName + ": cannot resolve detected property constructor at runtime."); return; } + typeDescriptor = ensureTypeDescriptor(reflectCtor); } else if (!options.deserializer) { logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is specified."); return; } } - if (isSpecialPropertyType(decoratorName, propCtor)) { + if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, _propKey, { - ctor: propCtor, + type: typeDescriptor, emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), @@ -1566,18 +1670,18 @@ function jsonMember(optionsOrTarget, propKey) { }; } } -function isSpecialPropertyType(decoratorName, propCtor) { - if (propCtor === Array) { +function isSpecialPropertyType(decoratorName, typeDescriptor) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { logError(decoratorName + ": property is an Array. Use the jsonArrayMember decorator to" + " serialize this property."); return true; } - if (propCtor === Set) { + if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { logError(decoratorName + ": property is a Set. Use the jsonSetMember decorator to" + " serialize this property."); return true; } - if (propCtor === Map) { + if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { logError(decoratorName + ": property is a Map. Use the jsonMapMember decorator to" + " serialize this property."); return true; @@ -1585,56 +1689,11 @@ function isSpecialPropertyType(decoratorName, propCtor) { return false; } -// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts - - - -/** - * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). - * @param options Additional options. - */ -function jsonArrayMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. - if (typeof elementConstructor !== "function") { - logError(decoratorName + ": could not resolve constructor of array elements at runtime."); - return; - } - var dimensions = options.dimensions === undefined ? 1 : options.dimensions; - if (!isNaN(dimensions) && dimensions < 1) { - logError(decoratorName + ": 'dimensions' option must be at least 1."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Array) { - logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - ctor: Array, - elementType: createArrayElementType(elementConstructor, dimensions), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: options.name || propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} -function createArrayElementType(elementCtor, dimensions) { - var elementTypes = new Array(dimensions).fill(Array, 0, -1); - elementTypes[dimensions - 1] = elementCtor; - return elementTypes; -} - // CONCATENATED MODULE: ./src/typedjson/json-set-member.ts + /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. @@ -1645,7 +1704,7 @@ function jsonSetMember(elementConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. - if (typeof elementConstructor !== "function") { + if (!isTypelike(elementConstructor)) { logError(decoratorName + ": could not resolve constructor of set elements at runtime."); return; } @@ -1655,8 +1714,7 @@ function jsonSetMember(elementConstructor, options) { return; } injectMetadataInformation(target, propKey, { - ctor: Set, - elementType: [elementConstructor], + type: SetT(elementConstructor), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), @@ -1672,6 +1730,7 @@ function jsonSetMember(elementConstructor, options) { + /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Map. @@ -1683,11 +1742,11 @@ function jsonMapMember(keyConstructor, valueConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. - if (typeof keyConstructor !== "function") { + if (!isTypelike(keyConstructor)) { logError(decoratorName + ": could not resolve constructor of map keys at runtime."); return; } - if (typeof valueConstructor !== "function") { + if (!isTypelike(valueConstructor)) { logError(decoratorName + ": could not resolve constructor of map values at runtime."); return; } @@ -1697,9 +1756,7 @@ function jsonMapMember(keyConstructor, valueConstructor, options) { return; } injectMetadataInformation(target, propKey, { - ctor: Map, - elementType: [valueConstructor], - keyType: keyConstructor, + type: MapT(keyConstructor, valueConstructor, { shape: options.shape }), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), @@ -1741,6 +1798,10 @@ function toJsonDecorator(target, options) { /* concated harmony reexport jsonSetMember */__webpack_require__.d(__webpack_exports__, "jsonSetMember", function() { return jsonSetMember; }); /* concated harmony reexport jsonMapMember */__webpack_require__.d(__webpack_exports__, "jsonMapMember", function() { return jsonMapMember; }); /* concated harmony reexport toJson */__webpack_require__.d(__webpack_exports__, "toJson", function() { return toJson; }); +/* concated harmony reexport ArrayT */__webpack_require__.d(__webpack_exports__, "ArrayT", function() { return ArrayT; }); +/* concated harmony reexport SetT */__webpack_require__.d(__webpack_exports__, "SetT", function() { return SetT; }); +/* concated harmony reexport MapT */__webpack_require__.d(__webpack_exports__, "MapT", function() { return MapT; }); + diff --git a/js/typedjson.js.map b/js/typedjson.js.map index cc381d9..ba487f7 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/options-base.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/parser.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/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\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 type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n if (isDirectlySerializableNativeType(typeDescriptor.ctor))\n {\n return sourceObject;\n }\n else if (typeDescriptor.ctor === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeDescriptor.ctor === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (isTypeTypedArray(typeDescriptor.ctor))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName?: string,\n memberOptions?: OptionsBase,\n ) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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, typeDescriptor.ctor, 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 memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n typeDescriptor: ArrayTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n typeDescriptor: SetTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n typeDescriptor: MapTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): IndexedObject|Array<{ key: any, value: any }> {\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, typeDescriptor.keyType, memberName, memberOptions),\n value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n objectName = \"object\",\n memberOptions?: OptionsBase,\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 = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = 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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor))\n {\n if (sourceObject.constructor === typeDescriptor.ctor)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName));\n }\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array))\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n typeDescriptor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedTypeIsConcrete && (\n typeDescriptor.ctor === Uint8Array\n || typeDescriptor.ctor === Uint8ClampedArray\n || typeDescriptor.ctor === Uint16Array\n || typeDescriptor.ctor === Uint32Array\n )\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n typeDescriptor.ctor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape))\n {\n return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n else\n {\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeDescriptor: ArrayTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n return sourceObject.map(element => {\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(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\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(\n sourceObject: any,\n typeDescriptor: SetTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\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 const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(this.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeDescriptor: MapTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!this.isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)));\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = this.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n this.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = this.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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\n return resultMap;\n }\n\n private _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 rootConstructor 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertAsArray(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertAsSet(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertAsMap(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertAsArray(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, MapT(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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: typeDescriptor,\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 typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 52a758b..db45b1b 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.5.2 - 2020-07-12 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r(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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\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 options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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 // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\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\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\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(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\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, memberOptions);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName, memberOptions);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName, memberOptions);\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, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeInfo: IScopeTypeInfo,\n memberName?: string,\n memberOptions?: OptionsBase,\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\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.ctor) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n {\n selfType: objMemberMetadata.ctor,\n elementTypes: objMemberMetadata.elementType,\n keyType: objMemberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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 * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n expectedElementType: Function[],\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, expectedElementType[0])\n ) {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n // For multidimensional arrays.\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [],\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeInfoForElements, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values\n * (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n expectedKeyType: Function,\n expectedElementType: Function,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Array<{ key: any, value: any }> {\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 const resultArray: Array<{ key: any, value: any }> = [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, memberOptions),\n value: this.convertSingleValue(value, elementTypeInfo, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined, isDirectlyDeserializableNativeType } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 memberOptions?: OptionsBase,\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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n {\n selfConstructor: objMemberMetadata.ctor,\n elementConstructor: objMemberMetadata.elementType,\n keyConstructor: objMemberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array || expectedSelfType === Float64Array)\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedSelfType === Uint8Array\n || expectedSelfType === Uint8ClampedArray\n || expectedSelfType === Uint16Array\n || expectedSelfType === Uint32Array\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n expectedSelfType as any,\n srcTypeNameForDebug,\n memberName,\n );\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 (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeInfo, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeInfo, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsMap(sourceObject, typeInfo, memberName, memberOptions);\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, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\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, `${memberName}[]`, memberOptions);\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(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\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(\n element,\n elementTypeInfo,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeInfo: IScopeTypeInfo,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n if (!(Array.isArray(sourceObject)))\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, memberName, memberOptions);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n valueTypeInfo,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { Constructor } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): { key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n 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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\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,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","METADATA_FIELD_KEY","MISSING_REFLECT_CONF_MSG","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","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","getKnownTypeNameFromType","dataMembers","Map","knownTypes","Set","isHandledWithoutAnnotation","injectMetadataInformation","propKey","objectMetadata","decoratorName","deserializer","parentMetadata","forEach","_metadata","_propKey","set","Object","defineProperty","enumerable","configurable","writable","getTypes","add","keys","key","undefined","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","assign","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeEmitter","targetObject","sourceObject","expectedSourceType","sourceTypeMetadata","__type","setTypeHintEmitter","typeEmitterCallback","TypeError","_typeHintEmitter","setErrorHandler","errorHandlerCallback","_errorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","convertAsArrayBuffer","convertAsDataView","convertAsArray","convertAsSet","convertAsMap","convertAsTypedArray","convertAsObject","expectedName","actualName","beforeSerializationMethodName","objMemberMetadata","serialized","objMemberOptions","serializer","element","i","expectedTypeName","actualTypeName","map","resultArray","resultElement","push","resultShape","result","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","defaultTypeResolver","get","setNameResolver","nameResolverCallback","_nameResolver","setTypeResolver","typeResolverCallback","_typeResolver","objectName","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","_mergeKnownTypes","_createKnownTypesMap","typeFromTypeHint","revivedValue","objMemberValue","objMemberDebugName","isRequired","initializerCallback","e","_instantiateType","onDeserializedMethodName","sourceKey","expectedTypeIsConcrete","srcTypeNameForDebug","_makeTypeErrorMessage","_throwTypeMismatchError","_convertAsFloatArray","_convertAsUintArray","_stringToArrayBuffer","_stringToDataView","isArray","isExpectedMapShape","resultSet","expectedShape","resultMap","resultKey","arrayType","every","elem","isNaN","targetType","actualSourceType","actualType","knownTypeMaps","knowTypes","knownTypeMeta","str","buf","bufView","strLen","charCodeAt","source","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","errorHandler","replacer","typeResolver","typeHintEmitter","indent","nameResolver","knownType","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","memberMetadata","onDeserialized","beforeSerialization","initializer","optionsBase","knownTypeMethodName","jsonMember","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\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 type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n if (isDirectlySerializableNativeType(typeDescriptor.ctor))\n {\n return sourceObject;\n }\n else if (typeDescriptor.ctor === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeDescriptor.ctor === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (isTypeTypedArray(typeDescriptor.ctor))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName?: string,\n memberOptions?: OptionsBase,\n ) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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, typeDescriptor.ctor, 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 memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n typeDescriptor: ArrayTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n typeDescriptor: SetTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n typeDescriptor: MapTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): IndexedObject|Array<{ key: any, value: any }> {\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, typeDescriptor.keyType, memberName, memberOptions),\n value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n objectName = \"object\",\n memberOptions?: OptionsBase,\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 = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = 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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor))\n {\n if (sourceObject.constructor === typeDescriptor.ctor)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName));\n }\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array))\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n typeDescriptor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedTypeIsConcrete && (\n typeDescriptor.ctor === Uint8Array\n || typeDescriptor.ctor === Uint8ClampedArray\n || typeDescriptor.ctor === Uint16Array\n || typeDescriptor.ctor === Uint32Array\n )\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n typeDescriptor.ctor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape))\n {\n return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n else\n {\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeDescriptor: ArrayTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n return sourceObject.map(element => {\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(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\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(\n sourceObject: any,\n typeDescriptor: SetTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\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 const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(this.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeDescriptor: MapTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!this.isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)));\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = this.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n this.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = this.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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\n return resultMap;\n }\n\n private _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 rootConstructor 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertAsArray(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertAsSet(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertAsMap(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertAsArray(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, MapT(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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: typeDescriptor,\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 typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/deserializer.d.ts b/js/typedjson/deserializer.d.ts index 5de62ee..586311e 100644 --- a/js/typedjson/deserializer.d.ts +++ b/js/typedjson/deserializer.d.ts @@ -1,11 +1,6 @@ import { IndexedObject } from "./types"; import { OptionsBase } from "./options-base"; -export interface IScopeTypeInfo { - selfConstructor: Function; - elementConstructor?: Function[]; - keyConstructor?: Function; - knownTypes: Map; -} +import { ArrayTypeDescriptor, ConcreteTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor } from "./type-descriptor"; export declare type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function | undefined | null; /** * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. @@ -19,11 +14,11 @@ export declare class Deserializer { setNameResolver(nameResolverCallback: (ctor: Function) => string): void; setTypeResolver(typeResolverCallback: TypeResolver): void; setErrorHandler(errorHandlerCallback: (error: Error) => void): void; - convertAsObject(sourceObject: IndexedObject, sourceObjectTypeInfo: IScopeTypeInfo, objectName?: string, memberOptions?: OptionsBase): {} | undefined; - convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): any; - convertAsArray(sourceObject: any, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): any[]; - convertAsSet(sourceObject: any, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): Set; - convertAsMap(sourceObject: any, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): Map; + convertAsObject(sourceObject: IndexedObject, typeDescriptor: ConcreteTypeDescriptor, knownTypes: Map, objectName?: string, memberOptions?: OptionsBase): {} | undefined; + convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): any; + convertAsArray(sourceObject: any, typeDescriptor: ArrayTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): any[]; + convertAsSet(sourceObject: any, typeDescriptor: SetTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): Set; + convertAsMap(sourceObject: any, typeDescriptor: MapTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): Map; private _convertAsFloatArray; private _convertAsUintArray; private _throwTypeMismatchError; @@ -33,5 +28,6 @@ export declare class Deserializer { private _createKnownTypesMap; private _stringToArrayBuffer; private _stringToDataView; + private isExpectedMapShape; private retrievePreserveNull; } diff --git a/js/typedjson/json-array-member.d.ts b/js/typedjson/json-array-member.d.ts index 83d9ade..b97b409 100644 --- a/js/typedjson/json-array-member.d.ts +++ b/js/typedjson/json-array-member.d.ts @@ -1,4 +1,5 @@ import { OptionsBase } from "./options-base"; +import { ArrayTypeDescriptor, TypeDescriptor } from "./type-descriptor"; export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -18,4 +19,5 @@ export interface IJsonArrayMemberOptions extends OptionsBase { * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). * @param options Additional options. */ -export declare function jsonArrayMember(elementConstructor: Function, options?: IJsonArrayMemberOptions): (target: Object, propKey: string | symbol) => void; +export declare function jsonArrayMember(elementConstructor: Function | TypeDescriptor, options?: IJsonArrayMemberOptions): (target: Object, propKey: string | symbol) => void; +export declare function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor; diff --git a/js/typedjson/json-map-member.d.ts b/js/typedjson/json-map-member.d.ts index a3996de..d89ec3d 100644 --- a/js/typedjson/json-map-member.d.ts +++ b/js/typedjson/json-map-member.d.ts @@ -1,5 +1,6 @@ import { OptionsBase } from "./options-base"; -export interface IJsonMapMemberOptions extends OptionsBase { +import { MapOptions, TypeDescriptor } from "./type-descriptor"; +export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; /** When set, a default value is emitted for each uninitialized json member. */ @@ -18,4 +19,4 @@ export interface IJsonMapMemberOptions extends OptionsBase { * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). * @param options Additional options. */ -export declare function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options?: IJsonMapMemberOptions): (target: Object, propKey: string | symbol) => void; +export declare function jsonMapMember(keyConstructor: Function | TypeDescriptor, valueConstructor: Function | TypeDescriptor, options?: IJsonMapMemberOptions): (target: Object, propKey: string | symbol) => void; diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts index 985838d..303c4b0 100644 --- a/js/typedjson/json-member.d.ts +++ b/js/typedjson/json-member.d.ts @@ -1,10 +1,11 @@ import { OptionsBase } from "./options-base"; +import { TypeDescriptor } from "./type-descriptor"; export interface IJsonMemberOptions extends OptionsBase { /** * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function; + constructor?: Function | TypeDescriptor; /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; /** When set, a default value is emitted if the property is uninitialized/undefined. */ diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts index f6adc34..ec0a45f 100644 --- a/js/typedjson/metadata.d.ts +++ b/js/typedjson/metadata.d.ts @@ -1,5 +1,6 @@ import { IndexedObject } from "./types"; import { OptionsBase } from "./options-base"; +import { TypeDescriptor } from "./type-descriptor"; export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ emitDefaultValue?: boolean; @@ -8,14 +9,10 @@ export interface JsonMemberMetadata { /** Property or field key of the json member. */ key: string; /** Constuctor (type) reference of the member. */ - ctor?: Function; + type?: TypeDescriptor; /** If set, indicates that the member must be present when deserializing. */ isRequired?: boolean; options?: OptionsBase; - /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */ - elementType?: Function[]; - /** If the json member is a map, sets member options of array keys. */ - keyType?: Function; /** Custom deserializer to use. */ deserializer?: (json: any) => any; /** Custom serializer to use. */ diff --git a/js/typedjson/serializer.d.ts b/js/typedjson/serializer.d.ts index 2208d4a..2012aa5 100644 --- a/js/typedjson/serializer.d.ts +++ b/js/typedjson/serializer.d.ts @@ -1,24 +1,7 @@ import { IndexedObject } from "./types"; import { JsonObjectMetadata } from "./metadata"; import { OptionsBase } from "./options-base"; -export interface IScopeTypeInfo { - selfType: Function; - elementTypes?: Function[]; - keyType?: Function; -} -export interface IScopeArrayTypeInfo extends IScopeTypeInfo { - selfType: new () => Array; - elementTypes: Function[]; -} -export interface IScopeSetTypeInfo extends IScopeTypeInfo { - selfType: new () => Set; - elementTypes: [Function]; -} -export interface IScopeMapTypeInfo extends IScopeTypeInfo { - selfType: new () => Map; - elementTypes: [Function]; - keyType: Function; -} +import { ArrayTypeDescriptor, ConcreteTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor } from "./type-descriptor"; export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; /** * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class @@ -40,20 +23,19 @@ export declare class Serializer { * Convert a value of any supported serializable type. * The value type will be detected, and the correct serialization method will be called. */ - convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): any; + convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any; /** * Performs the conversion of a typed object (usually a class instance) to a simple * javascript object for serialization. */ - convertAsObject(sourceObject: IndexedObject, typeInfo: IScopeTypeInfo, memberName?: string, memberOptions?: OptionsBase): IndexedObject; + convertAsObject(sourceObject: IndexedObject, typeDescriptor: ConcreteTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): IndexedObject; /** * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for * serialization. - * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions. * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ - convertAsArray(sourceObject: any[], expectedElementType: Function[], memberName?: string, memberOptions?: OptionsBase): any[]; + convertAsArray(sourceObject: any[], typeDescriptor: ArrayTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any[]; /** * Performs the conversion of a set of typed objects (or primitive values) into an array * of simple javascript objects. @@ -65,20 +47,16 @@ export declare class Serializer { * @param memberOptions If converted as a member, the member options. * @returns */ - convertAsSet(sourceObject: Set, expectedElementType: Function, memberName?: string, memberOptions?: OptionsBase): any[]; + convertAsSet(sourceObject: Set, typeDescriptor: SetTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any[]; /** * Performs the conversion of a map of typed objects (or primitive values) into an array * of simple javascript objects with `key` and `value` properties. * * @param sourceObject - * @param expectedKeyType The constructor of the expected Map keys - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). - * @param expectedElementType The constructor of the expected Map values - * (e.g. `Number` for `Map`, or `MyClass` for `Map`). * @param memberName Name of the object being serialized, used for debugging purposes. * @param memberOptions If converted as a member, the member options. */ - convertAsMap(sourceObject: Map, expectedKeyType: Function, expectedElementType: Function, memberName?: string, memberOptions?: OptionsBase): Array<{ + convertAsMap(sourceObject: Map, typeDescriptor: MapTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): IndexedObject | Array<{ key: any; value: any; }>; diff --git a/js/typedjson/type-descriptor.d.ts b/js/typedjson/type-descriptor.d.ts new file mode 100644 index 0000000..7fe7b5f --- /dev/null +++ b/js/typedjson/type-descriptor.d.ts @@ -0,0 +1,51 @@ +export declare abstract class TypeDescriptor { + readonly ctor: Function; + protected constructor(ctor: Function); + getTypes(): Function[]; +} +export declare type Typelike = TypeDescriptor | Function; +export declare class ConcreteTypeDescriptor extends TypeDescriptor { + constructor(ctor: Function); +} +export declare abstract class GenericTypeDescriptor extends TypeDescriptor { + protected constructor(ctor: Function); +} +export declare class ArrayTypeDescriptor extends GenericTypeDescriptor { + readonly elementType: TypeDescriptor; + constructor(elementType: TypeDescriptor); + getTypes(): Function[]; +} +export declare function ArrayT(elementType: Typelike): ArrayTypeDescriptor; +export declare class SetTypeDescriptor extends GenericTypeDescriptor { + readonly elementType: TypeDescriptor; + constructor(elementType: TypeDescriptor); + getTypes(): Function[]; +} +export declare function SetT(elementType: Typelike): SetTypeDescriptor; +export declare const enum MapShape { + /** + * A map will be serialized as an array of {key: ..., value: ...} objects. + */ + ARRAY = 0, + /** + * A map will be serialized as a JSON object. + */ + OBJECT = 1 +} +export interface MapOptions { + /** + * How the map should be serialized. Default is ARRAY. + */ + shape: MapShape; +} +export declare class MapTypeDescriptor extends GenericTypeDescriptor { + readonly keyType: TypeDescriptor; + readonly valueType: TypeDescriptor; + readonly options?: Partial | undefined; + constructor(keyType: TypeDescriptor, valueType: TypeDescriptor, options?: Partial | undefined); + getTypes(): Function[]; + getCompleteOptions(): MapOptions; +} +export declare function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor; +export declare function isTypelike(type: any): type is Typelike; +export declare function ensureTypeDescriptor(type: Typelike): TypeDescriptor; diff --git a/package-lock.json b/package-lock.json index 8756c5a..8667c5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.5.2", + "version": "1.6.0-rc1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3418541..da8d1dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.5.2", + "version": "1.6.0-rc1", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", From 77a6f573d057df480c484b48c57f28673c024fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sun, 26 Jul 2020 22:20:15 +0200 Subject: [PATCH 007/119] Allow to define type hints and resolver on classes --- package-lock.json | 6 +- package.json | 2 +- spec/base.spec.ts | 23 ++ spec/polymorphism-abstract-class.spec.ts | 190 +++++------ spec/polymorphism-custom-names.spec.ts | 236 +++++++------- spec/polymorphism-custom-type-hints.spec.ts | 296 ++++++++++++++++++ spec/polymorphism-interface.spec.ts | 201 ++++++------ spec/polymorphism-nested-arrays.spec.ts | 195 ++++++------ spec/polymorphism-root-abstract-class.spec.ts | 7 +- spec/polymorphism.spec.ts | 236 +++++++------- src/parser.ts | 89 +++--- src/typedjson.ts | 3 +- src/typedjson/deserializer.ts | 15 +- src/typedjson/helpers.ts | 42 +-- src/typedjson/json-member.ts | 31 +- src/typedjson/json-object.ts | 87 +++-- src/typedjson/metadata.ts | 95 +++--- src/typedjson/serializer.ts | 21 +- src/typedjson/types.ts | 8 +- 19 files changed, 1045 insertions(+), 738 deletions(-) create mode 100644 spec/polymorphism-custom-type-hints.spec.ts diff --git a/package-lock.json b/package-lock.json index 8667c5a..afec17c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5059,9 +5059,9 @@ } }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index da8d1dc..a45622b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "source-map-support": "^0.5.16", "ts-loader": "^6.2.1", "ts-node": "^8.10.2", - "typescript": "^3.7.5", + "typescript": "^3.9.7", "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.41.5", "webpack-auto-inject-version": "^1.2.2", diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 490e7c3..0e32606 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -245,4 +245,27 @@ describe('basic serialization of', function () { expect(deserialized).toEqual(expected); }); }); + + describe('structural inheritance', function () { + class JustForOrganizationalPurpose + { + + } + + @jsonObject + class Child extends JustForOrganizationalPurpose + { + + } + + it('should work for unannotated base class', function () { + expect(TypedJSON.stringify(new Child, Child)).toEqual('{}'); + expect(TypedJSON.parse('{}', Child)).toEqual(new Child); + }); + + it('should throw when using passing base for serialization/deserialization', function () { + expect(() => TypedJSON.stringify(new Child, JustForOrganizationalPurpose)).toThrow(); + expect(() => TypedJSON.parse('{}', JustForOrganizationalPurpose)).toThrow(); + }) + }); }); diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 7337c5a..69a82d0 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -1,115 +1,115 @@ import {isEqual} from "./utils/object-compare"; import {TypedJSON, jsonObject, jsonMember, jsonArrayMember} from "../src/typedjson"; -abstract class Node { - @jsonMember - name: string; -} - -@jsonObject -class SmallNode extends Node { - @jsonMember - inputType: string; - - @jsonMember - outputType: string; -} - -@jsonObject -class BigNode extends Node { - @jsonArrayMember(String) - inputs: string[]; - - @jsonArrayMember(String) - outputs: string[]; - - constructor() { - super(); - this.inputs = []; - this.outputs = []; +describe('polymorphic abstract classes', function() { + abstract class Node { + @jsonMember + name: string; } -} - -@jsonObject({ - knownTypes: [BigNode, SmallNode] -}) -class Graph { - @jsonArrayMember(Node) - nodes: Node[]; - @jsonMember - root: Node; + @jsonObject + class SmallNode extends Node { + @jsonMember + inputType: string; - constructor() { - this.nodes = []; + @jsonMember + outputType: string; } -} - -function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" - ]; - - return types[Math.floor(Math.random() * types.length)]; -} - -export function test(log: boolean) { - var graph = new Graph(); - - for (var i = 0; i < 20; i++) { - let node: Node; - - if (Math.random() < 0.25) { - let bigNode = new BigNode(); - - bigNode.inputs = [ - randPortType(), - randPortType(), - randPortType() - ]; - bigNode.outputs = [ - randPortType(), - randPortType() - ]; - - node = bigNode; - } else { - let smallNode = new SmallNode(); - - smallNode.inputType = randPortType(); - smallNode.outputType = randPortType(); - - node = smallNode; + + @jsonObject + class BigNode extends Node { + @jsonArrayMember(String) + inputs: string[]; + + @jsonArrayMember(String) + outputs: string[]; + + constructor() { + super(); + this.inputs = []; + this.outputs = []; } + } - node.name = `node_${i}`; + @jsonObject({ + knownTypes: [BigNode, SmallNode] + }) + class Graph { + @jsonArrayMember(Node) + nodes: Node[]; - if (i === 0) { - graph.root = node; - } else { - graph.nodes.push(node); + @jsonMember + root: Node; + + constructor() { + this.nodes = []; } } - var json = TypedJSON.stringify(graph, Graph); - var clone = TypedJSON.parse(json, Graph); + function randPortType() { + var types = [ + "string", + "integer", + "float", + "boolean", + "void" + ]; - if (log) { - console.log("Test: polymorphism with abstract property types..."); - console.log(graph); - console.log(JSON.parse(json)); - console.log(clone); - console.log("Test finished."); + return types[Math.floor(Math.random() * types.length)]; } - return isEqual(graph, clone); -} + function test(log: boolean) { + var graph = new Graph(); + + for (var i = 0; i < 20; i++) { + let node: Node; + + if (Math.random() < 0.25) { + let bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType() + ]; + bigNode.outputs = [ + randPortType(), + randPortType() + ]; + + node = bigNode; + } else { + let smallNode = new SmallNode(); + + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + node = smallNode; + } + + node.name = `node_${i}`; + + if (i === 0) { + graph.root = node; + } else { + graph.nodes.push(node); + } + } + + var json = TypedJSON.stringify(graph, Graph); + var clone = TypedJSON.parse(json, Graph); + + if (log) { + console.log("Test: polymorphism with abstract property types..."); + console.log(graph); + console.log(JSON.parse(json)); + console.log(clone); + console.log("Test finished."); + } + + return isEqual(graph, clone); + } -describe('polymorphic abstract classes', function() { it('should work', function () { expect(test(false)).toBeTruthy(); }); diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 0808424..4c261c2 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -1,144 +1,144 @@ import { isEqual } from "./utils/object-compare"; import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from "../src/typedjson"; -@jsonObject -class Person { - @jsonMember({ name: "first-name" }) - public firstName: string; - - @jsonMember({ name: "last-name" }) - public lastName: string; - - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) { - this.firstName = firstName; - this.lastName = lastName; +describe('polymorphic custom names', function() { + @jsonObject + class Person { + @jsonMember({ name: "first-name" }) + public firstName: string; + + @jsonMember({ name: "last-name" }) + public lastName: string; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName?: string, lastName?: string) { + if (firstName && lastName) { + this.firstName = firstName; + this.lastName = lastName; + } } } -} -@jsonObject -class Employee extends Person { - @jsonMember - public salary: number; + @jsonObject + class Employee extends Person { + @jsonMember + public salary: number; - @jsonMember - public joined: Date; + @jsonMember + public joined: Date; - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, salary: number, joined: Date); - constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { - super(firstName, lastName); + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, salary: number, joined: Date); + constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { + super(firstName, lastName); - if (salary && joined) { - this.salary = salary; - this.joined = joined; + if (salary && joined) { + this.salary = salary; + this.joined = joined; + } } } -} - -@jsonObject({ name: "part-time-employee" }) -class PartTimeEmployee extends Employee { - @jsonMember({ name: "work-hours" }) - public workHours: number; -} - -@jsonObject() -class Investor extends Person { - @jsonMember({ name: "invest-amount" }) - public investAmount: number; - - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, investAmount: number); - constructor(firstName?: string, lastName?: string, investAmount?: number) { - super(firstName, lastName); - - this.investAmount = investAmount || 0; - } -} -@jsonObject({ name: "company", knownTypes: [PartTimeEmployee, Investor] }) -class Company { - @jsonMember - public name: string; + @jsonObject({ name: "part-time-employee" }) + class PartTimeEmployee extends Employee { + @jsonMember({ name: "work-hours" }) + public workHours: number; + } - @jsonArrayMember(Employee, { name: 'company-employees' }) - public employees: Array; + @jsonObject() + class Investor extends Person { + @jsonMember({ name: "invest-amount" }) + public investAmount: number; - @jsonMember - public owner: Person; + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); - constructor() { - this.employees = []; - } -} - -export function test(log: boolean) { - // Create a Company. - var company = new Company(); - company.name = "Json Types"; - - switch (Math.floor(Math.random() * 4)) { - case 0: - company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); - break; - - case 1: - company.owner = new Investor("John", "White", 1700000); - break; - - case 2: - company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); - (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); - break; - - default: - company.owner = new Person("John", "White"); - break; + this.investAmount = investAmount || 0; + } } - // Add employees. - for (var j = 0; j < 20; j++) { - if (Math.random() < 0.2) { - var newPartTimeEmployee = new PartTimeEmployee( - `firstname_${j}`, - `lastname_${j}`, - Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) - ); - - newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); - - company.employees.push(newPartTimeEmployee); - } else { - company.employees.push(new Employee( - `firstname_${j}`, - `lastname_${j}`, - Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) - )); + @jsonObject({ name: "company", knownTypes: [PartTimeEmployee, Investor] }) + class Company { + @jsonMember + public name: string; + + @jsonArrayMember(Employee, { name: 'company-employees' }) + public employees: Array; + + @jsonMember + public owner: Person; + + constructor() { + this.employees = []; } } - var json = TypedJSON.stringify(company, Company); - var reparsed = TypedJSON.parse(json, Company); + function test(log: boolean) { + // Create a Company. + var company = new Company(); + company.name = "Json Types"; - if (log) { - console.log("Test: polymorphism with custom names..."); - console.log(company); - console.log(JSON.parse(json)); - console.log(reparsed); - console.log("Test finished."); - } + switch (Math.floor(Math.random() * 4)) { + case 0: + company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); + break; - return isEqual(company, reparsed); -} + case 1: + company.owner = new Investor("John", "White", 1700000); + break; + + case 2: + company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); + (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); + break; + + default: + company.owner = new Person("John", "White"); + break; + } + + // Add employees. + for (var j = 0; j < 20; j++) { + if (Math.random() < 0.2) { + var newPartTimeEmployee = new PartTimeEmployee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)) + ); + + newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); + + company.employees.push(newPartTimeEmployee); + } else { + company.employees.push(new Employee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)) + )); + } + } + + var json = TypedJSON.stringify(company, Company); + var reparsed = TypedJSON.parse(json, Company); + + if (log) { + console.log("Test: polymorphism with custom names..."); + console.log(company); + console.log(JSON.parse(json)); + console.log(reparsed); + console.log("Test finished."); + } + + return isEqual(company, reparsed); + } -describe('polymorphic custom names', function() { it('should work', function () { expect(test(false)).toBeTruthy(); }); diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts new file mode 100644 index 0000000..b0ad2db --- /dev/null +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -0,0 +1,296 @@ +import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from "../src/typedjson"; +import { IndexedObject } from '../src/typedjson/types'; + +describe('polymorphism custom type hints', function () { + + describe('should work for a base class', function () { + let TYPE_MAP: IndexedObject; + + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => targetObject.personType = sourceObject.constructor.name + 'Type', + typeResolver: sourceObject => TYPE_MAP[sourceObject.personType], + }) + abstract class Person + { + @jsonMember + public firstName: string; + + @jsonMember + public lastName: string; + + constructor(); + constructor(firstName?: string, lastName?: string); + constructor(firstName: string, lastName: string); + constructor(firstName?: string, lastName?: string) { + if (firstName && lastName) + { + this.firstName = firstName; + this.lastName = lastName; + } + } + } + + @jsonObject + class Employee extends Person + { + @jsonMember + public salary: number; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, salary: number); + constructor(firstName?: string, lastName?: string, salary?: number) { + super(firstName, lastName); + + if (salary) + { + this.salary = salary; + } + } + } + + @jsonObject + class PartTimeEmployee extends Employee + { + @jsonMember + public workHours: number; + } + + @jsonObject + class Investor extends Person + { + @jsonMember + public investAmount: number; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); + + this.investAmount = investAmount || 0; + } + } + + TYPE_MAP = { + 'EmployeeType': Employee, + 'PartTimeEmployeeType': PartTimeEmployee, + 'InvestorType': Investor, + } + + @jsonObject + class Company + { + @jsonMember + public name: string; + + @jsonArrayMember(Employee) + public employees: Array = []; + + @jsonMember + public owner: Person; + } + + it('should emit custom hint', function () { + const company = new Company(); + company.name = "Json Types"; + company.owner = new Investor("John", "White", 1700000); + + const partTime = new PartTimeEmployee("Abe", "White", 160000); + partTime.workHours = 20; + company.employees = [ + new Employee("Donn", "Worker", 240000), + partTime, + new Employee("Smith", "Elly", 35500), + ]; + + const json = TypedJSON.toPlainJson(company, Company); + expect(json).toEqual({ + name: 'Json Types', + owner: {personType: 'InvestorType', firstName: 'John', lastName: 'White', investAmount: 1700000}, + employees: [ + {personType: 'EmployeeType', firstName: 'Donn', lastName: 'Worker', salary: 240000}, + { + personType: 'PartTimeEmployeeType', + firstName: 'Abe', + lastName: 'White', + salary: 160000, + workHours: 20, + }, + {personType: 'EmployeeType', firstName: 'Smith', lastName: 'Elly', salary: 35500}, + ], + }); + }); + + it('should resolve custom hints', function () { + const json = { + name: 'Json Types', + owner: {personType: 'InvestorType', firstName: 'John', lastName: 'White', investAmount: 1700000}, + employees: [ + {personType: 'EmployeeType', firstName: 'Donn', lastName: 'Worker', salary: 240000}, + { + personType: 'PartTimeEmployeeType', + firstName: 'Abe', + lastName: 'White', + salary: 160000, + workHours: 20, + }, + {personType: 'EmployeeType', firstName: 'Smith', lastName: 'Elly', salary: 35500}, + ], + }; + + const deserialized = TypedJSON.parse(JSON.stringify(json), Company); + + const company = new Company(); + company.name = "Json Types"; + company.owner = new Investor("John", "White", 1700000); + + const partTime = new PartTimeEmployee("Abe", "White", 160000); + partTime.workHours = 20; + company.employees = [ + new Employee("Donn", "Worker", 240000), + partTime, + new Employee("Smith", "Elly", 35500), + ]; + expect(deserialized).toEqual(company); + }); + }); + + describe('should override parents', function () { + abstract class StructuralBase + { + @jsonMember + value: string; + } + + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => targetObject.type = (sourceObject.constructor as any).type, + typeResolver: (sourceObject => sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne), + }) + abstract class SemanticBaseOne extends StructuralBase + { + @jsonMember + prop1: number; + } + + @jsonObject + class ConcreteOne extends SemanticBaseOne + { + static type = 'sub-one'; + @jsonMember + propSub: string; + } + + @jsonObject + class AnotherConcreteOne extends SemanticBaseOne + { + static type = 'sub-two'; + @jsonMember + propSub: number; + } + + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => targetObject.hint = sourceObject instanceof ConcreteTwo ? 'first' : 'another', + typeResolver: (sourceObject => sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo), + }) + abstract class SemanticBaseTwo extends StructuralBase + { + @jsonMember + prop2: number; + } + + @jsonObject + class ConcreteTwo extends SemanticBaseTwo + { + @jsonMember + propSub: string; + } + + @jsonObject + class AnotherConcreteTwo extends SemanticBaseTwo + { + @jsonMember + propSub: number; + } + + it('should work for SemanticBaseOne', function () { + const inputAndResult: [() => SemanticBaseOne, () => IndexedObject][] = [ + [ + () => { + const expected = new ConcreteOne(); + expected.value = 'base'; + expected.prop1 = 10; + expected.propSub = 'something'; + return expected; + }, + () => ({ + type: 'sub-one', + value: 'base', + prop1: 10, + propSub: 'something', + }), + ], + [ + () => { + const expected = new AnotherConcreteOne(); + expected.value = 'base value'; + expected.prop1 = 245; + expected.propSub = 234; + return expected; + }, + () => ({ + type: 'sub-two', + value: 'base value', + prop1: 245, + propSub: 234, + }), + ], + ]; + + inputAndResult.forEach(([inputFn, serializedFn]) => { + expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseOne)).toEqual(serializedFn()); + expect(TypedJSON.parse(serializedFn(), SemanticBaseOne)).toEqual(inputFn()); + }) + }); + + it('should work for SemanticBaseTwo', function () { + const inputAndResult: [() => SemanticBaseTwo, () => IndexedObject][] = [ + [ + () => { + const expected = new ConcreteTwo(); + expected.value = 'base'; + expected.prop2 = 546; + expected.propSub = 'something'; + return expected; + }, + () => ({ + hint: 'first', + value: 'base', + prop2: 546, + propSub: 'something', + }), + ], + [ + () => { + const expected = new AnotherConcreteTwo(); + expected.value = 'base value'; + expected.prop2 = 74; + expected.propSub = 234; + return expected; + }, + () => ({ + hint: 'another', + value: 'base value', + prop2: 74, + propSub: 234, + }), + ], + ]; + + inputAndResult.forEach(([inputFn, serializedFn]) => { + expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseTwo)).toEqual(serializedFn()); + expect(TypedJSON.parse(serializedFn(), SemanticBaseTwo)).toEqual(inputFn()); + }) + }); + }) +}); diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index da20686..557b976 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,127 +1,128 @@ import {isEqual} from "./utils/object-compare"; import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; -interface Point { - x: number; - y: number; -} +describe('polymorphic interfaces', function() { + + interface Point { + x: number; + y: number; + } -@jsonObject -class SmallNode implements Point { - @jsonMember - x: number; + @jsonObject + class SmallNode implements Point { + @jsonMember + x: number; - @jsonMember - y: number; + @jsonMember + y: number; - @jsonMember - inputType: string; + @jsonMember + inputType: string; - @jsonMember - outputType: string; -} + @jsonMember + outputType: string; + } -@jsonObject -class BigNode implements Point { - @jsonMember - x: number; + @jsonObject + class BigNode implements Point { + @jsonMember + x: number; - @jsonMember - y: number; + @jsonMember + y: number; - @jsonArrayMember(String) - inputs: string[]; + @jsonArrayMember(String) + inputs: string[]; - @jsonArrayMember(String) - outputs: string[]; + @jsonArrayMember(String) + outputs: string[]; - constructor() { - this.inputs = []; - this.outputs = []; + constructor() { + this.inputs = []; + this.outputs = []; + } } -} -@jsonObject({ - knownTypes: [BigNode, SmallNode] -}) -class GraphGrid { - @jsonArrayMember(Object) - points: Point[]; + @jsonObject({ + knownTypes: [BigNode, SmallNode] + }) + class GraphGrid { + @jsonArrayMember(Object) + points: Point[]; - @jsonMember - root: Point; + @jsonMember + root: Point; - constructor() { - this.points = []; - } -} - -function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" - ]; - - return types[Math.floor(Math.random() * types.length)]; -} - -export function test(log: boolean) { - var graph = new GraphGrid(); - - for (var i = 0; i < 20; i++) { - let point: Point; - - if (Math.random() < 0.25) { - let bigNode = new BigNode(); - - bigNode.inputs = [ - randPortType(), - randPortType(), - randPortType() - ]; - bigNode.outputs = [ - randPortType(), - randPortType() - ]; - - point = bigNode; - } else { - let smallNode = new SmallNode(); - - smallNode.inputType = randPortType(); - smallNode.outputType = randPortType(); - - point = smallNode; + constructor() { + this.points = []; } + } - point.x = Math.random(); - point.y = Math.random(); + function randPortType() { + var types = [ + "string", + "integer", + "float", + "boolean", + "void" + ]; - if (i === 0) { - graph.root = point; - } else { - graph.points.push(point); - } + return types[Math.floor(Math.random() * types.length)]; } - var json = TypedJSON.stringify(graph, GraphGrid); - var clone = TypedJSON.parse(json, GraphGrid); + function test(log: boolean) { + var graph = new GraphGrid(); - if (log) { - console.log("Test: polymorphism with interface property types..."); - console.log(graph); - console.log(JSON.parse(json)); - console.log(clone); - console.log("Test finished."); - } + for (var i = 0; i < 20; i++) { + let point: Point; - return isEqual(graph, clone); -} + if (Math.random() < 0.25) { + let bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType() + ]; + bigNode.outputs = [ + randPortType(), + randPortType() + ]; + + point = bigNode; + } else { + let smallNode = new SmallNode(); + + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + point = smallNode; + } + + point.x = Math.random(); + point.y = Math.random(); + + if (i === 0) { + graph.root = point; + } else { + graph.points.push(point); + } + } + + var json = TypedJSON.stringify(graph, GraphGrid); + var clone = TypedJSON.parse(json, GraphGrid); + + if (log) { + console.log("Test: polymorphism with interface property types..."); + console.log(graph); + console.log(JSON.parse(json)); + console.log(clone); + console.log("Test finished."); + } + + return isEqual(graph, clone); + } -describe('polymorphic interfaces', function() { it('should work', function () { expect(test(false)).toBeTruthy(); }); diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index ca82994..d9e2ea0 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -1,132 +1,133 @@ import {isEqual} from "./utils/object-compare"; import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; -abstract class Node { - @jsonMember - name: string; -} - -@jsonObject -class SmallNode extends Node { - @jsonMember - inputType: string; - - @jsonMember - outputType: string; -} - -@jsonObject -class BigNode extends Node { - @jsonArrayMember(String) - inputs: string[]; - - @jsonArrayMember(String) - outputs: string[]; - - constructor() { - super(); - this.inputs = []; - this.outputs = []; - } -} +describe('polymorphism in nested arrays', function() { -@jsonObject({ knownTypes: [BigNode, SmallNode] }) -class Graph { - @jsonArrayMember(Node, {dimensions: 2}) - items: Array>; + abstract class Node { + @jsonMember + name: string; + } - @jsonArrayMember(SmallNode, {dimensions: 2}) - smallItems: Array>; + @jsonObject + class SmallNode extends Node { + @jsonMember + inputType: string; - constructor() { - this.items = []; - this.smallItems = []; + @jsonMember + outputType: string; } -} -function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" - ]; + @jsonObject + class BigNode extends Node { + @jsonArrayMember(String) + inputs: string[]; - return types[Math.floor(Math.random() * types.length)]; -} + @jsonArrayMember(String) + outputs: string[]; -export function test(log: boolean) { - var graph = new Graph(); - - for (var i = 0; i < 20; i++) { - graph.smallItems.push([]); + constructor() { + super(); + this.inputs = []; + this.outputs = []; + } + } - for (var j = 0; j < 8; j++) { - let node = new SmallNode(); + @jsonObject({ knownTypes: [BigNode, SmallNode] }) + class Graph { + @jsonArrayMember(Node, {dimensions: 2}) + items: Array>; - node.name = `smallnode_${i}_${j}`; - node.inputType = randPortType(); - node.outputType = randPortType(); + @jsonArrayMember(SmallNode, {dimensions: 2}) + smallItems: Array>; - graph.smallItems[i].push(node); + constructor() { + this.items = []; + this.smallItems = []; } } - for (var i = 0; i < 20; i++) { - graph.items.push([]); + function randPortType() { + var types = [ + "string", + "integer", + "float", + "boolean", + "void" + ]; - for (var j = 0; j < 8; j++) { - let node: Node; + return types[Math.floor(Math.random() * types.length)]; + } - if (Math.random() < 0.25) { - let bigNode = new BigNode(); + function test(log: boolean) { + var graph = new Graph(); - bigNode.inputs = [ - randPortType(), - randPortType(), - randPortType() - ]; - bigNode.outputs = [ - randPortType(), - randPortType() - ]; + for (var i = 0; i < 20; i++) { + graph.smallItems.push([]); - node = bigNode; - } else { - let smallNode = new SmallNode(); + for (var j = 0; j < 8; j++) { + let node = new SmallNode(); - smallNode.inputType = randPortType(); - smallNode.outputType = randPortType(); + node.name = `smallnode_${i}_${j}`; + node.inputType = randPortType(); + node.outputType = randPortType(); - node = smallNode; + graph.smallItems[i].push(node); } + } + + for (var i = 0; i < 20; i++) { + graph.items.push([]); + + for (var j = 0; j < 8; j++) { + let node: Node; + + if (Math.random() < 0.25) { + let bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType() + ]; + bigNode.outputs = [ + randPortType(), + randPortType() + ]; - node.name = `node_${i}_${j}`; + node = bigNode; + } else { + let smallNode = new SmallNode(); - graph.items[i].push(node); + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + node = smallNode; + } + + node.name = `node_${i}_${j}`; + + graph.items[i].push(node); + } } - } - var json = TypedJSON.stringify(graph, Graph); + var json = TypedJSON.stringify(graph, Graph); - if (log) { - console.log("Test: polymorphism with nested arrays..."); - console.log(graph); - console.log(JSON.parse(json)); - } + if (log) { + console.log("Test: polymorphism with nested arrays..."); + console.log(graph); + console.log(JSON.parse(json)); + } - var clone = TypedJSON.parse(json, Graph); + var clone = TypedJSON.parse(json, Graph); - if (log) { - console.log(clone); - console.log("Test finished."); - } + if (log) { + console.log(clone); + console.log("Test finished."); + } - return isEqual(graph, clone); -} + return isEqual(graph, clone); + } -describe('polymorphism in nested arrays', function() { it('should work', function () { expect(test(false)).toBeTruthy(); }); diff --git a/spec/polymorphism-root-abstract-class.spec.ts b/spec/polymorphism-root-abstract-class.spec.ts index 5e10b73..df8ffbb 100644 --- a/spec/polymorphism-root-abstract-class.spec.ts +++ b/spec/polymorphism-root-abstract-class.spec.ts @@ -25,12 +25,11 @@ describe('single class', function () { } // todo we need something better - jsonObject({ knownTypes: [Bob]})(Person as any); + jsonObject({ knownTypes: [Bob]})(Person); describe('deserialized', function () { beforeAll(function () { - // todo fix types so they accept abstract - this.person = TypedJSON.parse('{ "__type": "Bob", "firstName": "John", "lastName": "Doe", "pounds": 40 }', Person as any); + this.person = TypedJSON.parse('{ "__type": "Bob", "firstName": "John", "lastName": "Doe", "pounds": 40 }', Person); }); it('should be of proper type', function () { @@ -50,7 +49,7 @@ describe('single class', function () { person.lastName = 'Doe'; person.pounds = 30; // todo fix types so they accept abstract - expect(TypedJSON.stringify(person, Person as any)) + expect(TypedJSON.stringify(person, Person)) .toBe('{"firstName":"John","lastName":"Doe","pounds":30,"__type":"Bob"}'); }); }); diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index f093a24..82b748d 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -1,144 +1,144 @@ import {isEqual} from "./utils/object-compare"; import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; -@jsonObject -class Person { - @jsonMember - public firstName: string; - - @jsonMember - public lastName: string; - - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) { - this.firstName = firstName; - this.lastName = lastName; +describe('polymorphism', function() { + @jsonObject + class Person { + @jsonMember + public firstName: string; + + @jsonMember + public lastName: string; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName?: string, lastName?: string) { + if (firstName && lastName) { + this.firstName = firstName; + this.lastName = lastName; + } } } -} -@jsonObject -class Employee extends Person { - @jsonMember - public salary: number; + @jsonObject + class Employee extends Person { + @jsonMember + public salary: number; - @jsonMember - public joined: Date; + @jsonMember + public joined: Date; - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, salary: number, joined: Date); - constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { - super(firstName, lastName); + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, salary: number, joined: Date); + constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { + super(firstName, lastName); - if (salary && joined) { - this.salary = salary; - this.joined = joined; + if (salary && joined) { + this.salary = salary; + this.joined = joined; + } } } -} - -@jsonObject -class PartTimeEmployee extends Employee { - @jsonMember - public workHours: number; -} - -@jsonObject -class Investor extends Person { - @jsonMember - public investAmount: number; - - constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, investAmount: number); - constructor(firstName?: string, lastName?: string, investAmount?: number) { - super(firstName, lastName); - - this.investAmount = investAmount || 0; - } -} -@jsonObject({ knownTypes: [PartTimeEmployee, Investor] }) -class Company { - @jsonMember - public name: string; + @jsonObject + class PartTimeEmployee extends Employee { + @jsonMember + public workHours: number; + } - @jsonArrayMember(Employee) - public employees: Array; + @jsonObject + class Investor extends Person { + @jsonMember + public investAmount: number; - @jsonMember - public owner: Person; + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); - constructor() { - this.employees = []; - } -} - -export function test(log: boolean) { - // Create a Company. - var company = new Company(); - company.name = "Json Types"; - - switch (Math.floor(Math.random() * 4)) { - case 0: - company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); - break; - - case 1: - company.owner = new Investor("John", "White", 1700000); - break; - - case 2: - company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); - (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); - break; - - default: - company.owner = new Person("John", "White"); - break; + this.investAmount = investAmount || 0; + } } - // Add employees. - for (var j = 0; j < 20; j++) { - if (Math.random() < 0.2) { - var newPartTimeEmployee = new PartTimeEmployee( - `firstname_${j}`, - `lastname_${j}`, - Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) - ); - - newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); - - company.employees.push(newPartTimeEmployee); - } else { - company.employees.push(new Employee( - `firstname_${j}`, - `lastname_${j}`, - Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) - )); + @jsonObject({ knownTypes: [PartTimeEmployee, Investor] }) + class Company { + @jsonMember + public name: string; + + @jsonArrayMember(Employee) + public employees: Array; + + @jsonMember + public owner: Person; + + constructor() { + this.employees = []; } } - var json = TypedJSON.stringify(company, Company); - var reparsed = TypedJSON.parse(json, Company); + function test(log: boolean) { + // Create a Company. + var company = new Company(); + company.name = "Json Types"; - if (log) { - console.log("Test: polymorphism..."); - console.log(company); - console.log(JSON.parse(json)); - console.log(reparsed); - console.log("Test finished."); - } + switch (Math.floor(Math.random() * 4)) { + case 0: + company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); + break; - return isEqual(company, reparsed); -} + case 1: + company.owner = new Investor("John", "White", 1700000); + break; + + case 2: + company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); + (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); + break; + + default: + company.owner = new Person("John", "White"); + break; + } + + // Add employees. + for (var j = 0; j < 20; j++) { + if (Math.random() < 0.2) { + var newPartTimeEmployee = new PartTimeEmployee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)) + ); + + newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); + + company.employees.push(newPartTimeEmployee); + } else { + company.employees.push(new Employee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)) + )); + } + } + + var json = TypedJSON.stringify(company, Company); + var reparsed = TypedJSON.parse(json, Company); + + if (log) { + console.log("Test: polymorphism..."); + console.log(company); + console.log(JSON.parse(json)); + console.log(reparsed); + console.log("Test finished."); + } + + return isEqual(company, reparsed); + } -describe('polymorphism', function() { it('should work', function () { expect(test(false)).toBeTruthy(); }); diff --git a/src/parser.ts b/src/parser.ts index 14ee1d6..73876b0 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,14 +1,14 @@ -import { Constructor, IndexedObject } from "./typedjson/types"; -import { Serializer, TypeHintEmitter } from "./typedjson/serializer"; -import { Deserializer, TypeResolver } from "./typedjson/deserializer"; -import { JsonObjectMetadata } from "./typedjson/metadata"; +import { Constructor, IndexedObject, Serializable } from "./typedjson/types"; +import { Serializer, defaultTypeEmitter } from "./typedjson/serializer"; +import { Deserializer, defaultTypeResolver } from "./typedjson/deserializer"; +import { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from "./typedjson/metadata"; import { logError, logWarning, nameof, parseToJSObject } from "./typedjson/helpers"; import { extractOptionBase, OptionsBase } from "./typedjson/options-base"; import { createArrayType } from "./typedjson/json-array-member"; import { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor'; -export type JsonTypes = Object|boolean|string|number|null|undefined; -export { TypeResolver, TypeHintEmitter }; +export type JsonTypes = Object | boolean | string | number | null | undefined; +export { defaultTypeResolver, defaultTypeEmitter }; export interface ITypedJSONSettings extends OptionsBase { @@ -52,44 +52,44 @@ export class TypedJSON { //#region Static public static parse( - object: any, rootType: Constructor, settings?: ITypedJSONSettings, + object: any, rootType: Serializable, settings?: ITypedJSONSettings, ): T|undefined { return new TypedJSON(rootType, settings).parse(object); } public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1 ): T[]; public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings: ITypedJSONSettings|undefined, dimensions: 2 ): T[][]; public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings: ITypedJSONSettings|undefined, dimensions: 3 ): T[][][]; public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings: ITypedJSONSettings|undefined, dimensions: 4 ): T[][][][]; public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings: ITypedJSONSettings|undefined, dimensions: 5 ): T[][][][][]; public static parseAsArray( object: any, - elementType: Constructor, + elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: number ): any[] { @@ -97,105 +97,105 @@ export class TypedJSON } public static parseAsSet( - object: any, elementType: Constructor, settings?: ITypedJSONSettings, + object: any, elementType: Serializable, settings?: ITypedJSONSettings, ): Set { return new TypedJSON(elementType, settings).parseAsSet(object); } public static parseAsMap( object: any, - keyType: Constructor, - valueType: Constructor, + keyType: Serializable, + valueType: Serializable, settings?: ITypedJSONSettings, ): Map { return new TypedJSON(valueType, settings).parseAsMap(object, keyType); } public static toPlainJson( - object: T, rootType: Constructor, settings?: ITypedJSONSettings, + object: T, rootType: Serializable, settings?: ITypedJSONSettings, ): JsonTypes { return new TypedJSON(rootType, settings).toPlainJson(object); } public static toPlainArray( - object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings, + object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, ): Object[]; public static toPlainArray( - object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings, + object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, ): Object[][]; public static toPlainArray( - object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings, + object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, ): Object[][][]; public static toPlainArray( - object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings, + object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, ): Object[][][][]; public static toPlainArray( - object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings, + object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, ): Object[][][][][]; public static toPlainArray( - object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings, + object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, ): any[]; public static toPlainArray( - object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings, + object: any[], elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings, ): any[] { return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); } public static toPlainSet( - object: Set, elementType: Constructor, settings?: ITypedJSONSettings, + object: Set, elementType: Serializable, settings?: ITypedJSONSettings, ): Object[]|undefined { return new TypedJSON(elementType, settings).toPlainSet(object); } public static toPlainMap( object: Map, - keyCtor: Constructor, - valueCtor: Constructor, + keyCtor: Serializable, + valueCtor: Serializable, settings?: ITypedJSONSettings, ): IndexedObject|{ key: any, value: any }[]|undefined { return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); } public static stringify( - object: T, rootType: Constructor, settings?: ITypedJSONSettings, + object: T, rootType: Serializable, settings?: ITypedJSONSettings, ): string { return new TypedJSON(rootType, settings).stringify(object); } public static stringifyAsArray( - object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings, + object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings, + object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings, + object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings, + object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings, + object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings, + object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, ): string; public static stringifyAsArray( - object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings, + object: any[], elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings, ): string { return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); } public static stringifyAsSet( - object: Set, elementType: Constructor, settings?: ITypedJSONSettings, + object: Set, elementType: Serializable, settings?: ITypedJSONSettings, ): string { return new TypedJSON(elementType, settings).stringifyAsSet(object); } public static stringifyAsMap( object: Map, - keyCtor: Constructor, - valueCtor: Constructor, + keyCtor: Serializable, + valueCtor: Serializable, settings?: ITypedJSONSettings, ): string { return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); @@ -221,7 +221,7 @@ export class TypedJSON private deserializer: Deserializer = new Deserializer(); private globalKnownTypes: Array> = []; private indent: number = 0; - private rootConstructor: Constructor; + private rootConstructor: Serializable; private errorHandler: (e: Error) => void; private nameResolver: (ctor: Function) => string; private replacer?: (key: string, value: any) => any; @@ -232,7 +232,7 @@ export class TypedJSON * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ - constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings) + constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); @@ -384,7 +384,7 @@ export class TypedJSON ); } - public parseAsMap(object: any, keyConstructor: Constructor): Map + public parseAsMap(object: any, keyConstructor: Serializable): Map { const json = parseToJSObject(object, Map); return this.deserializer.convertAsMap( @@ -444,8 +444,9 @@ export class TypedJSON } } - public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined - { + public toPlainMap( + object: Map, keyConstructor: Serializable, + ): IndexedObject | { key: any, value: any }[] | undefined { try { return this.serializer.convertAsMap(object, MapT(keyConstructor, this.rootConstructor)); @@ -487,7 +488,7 @@ export class TypedJSON return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent); } - public stringifyAsMap(object: Map, keyConstructor: Constructor): string + public stringifyAsMap(object: Map, keyConstructor: Serializable): string { return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); } diff --git a/src/typedjson.ts b/src/typedjson.ts index ec14b16..7474d41 100644 --- a/src/typedjson.ts +++ b/src/typedjson.ts @@ -1,4 +1,5 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from "./parser"; +export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from "./parser"; +export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from "./typedjson/metadata"; export { jsonObject } from "./typedjson/json-object"; export { jsonMember } from "./typedjson/json-member"; export { jsonArrayMember } from "./typedjson/json-array-member"; diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 3e47700..81b771a 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -1,6 +1,6 @@ import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from "./helpers"; import { Constructor, IndexedObject } from "./types"; -import { JsonObjectMetadata } from "./metadata"; +import { JsonObjectMetadata, TypeResolver } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; import { ArrayTypeDescriptor, @@ -11,9 +11,9 @@ import { TypeDescriptor, } from "./type-descriptor"; -export type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null; - -function defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined { +export function defaultTypeResolver( + sourceObject: IndexedObject, knownTypes: Map, +): Function | undefined { if (sourceObject.__type) return knownTypes.get(sourceObject.__type); } @@ -70,6 +70,7 @@ export class Deserializer let expectedSelfType = typeDescriptor.ctor; let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType); let knownTypeConstructors = knownTypes; + let typeResolver = this._typeResolver; if (sourceObjectMetadata) { @@ -78,10 +79,14 @@ export class Deserializer knownTypeConstructors, this._createKnownTypesMap(sourceObjectMetadata.knownTypes), ); + if (sourceObjectMetadata.typeResolver) + { + typeResolver = sourceObjectMetadata.typeResolver; + } } // Check if a type-hint is available from the source object. - const typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors); + const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); if (typeFromTypeHint) { diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 1f87936..6a9e8d6 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -1,34 +1,13 @@ -declare abstract class Reflect +import { Serializable } from './types'; + +declare abstract class Reflect { public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; - export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + ' and "emitDecoratorMetadata" in your tsconfig.json?'; -export function getDefaultValue(type: { new (): T }): T|undefined -{ - switch (type as any) - { - case Number: - return 0 as any; - - case String: - return "" as any; - - case Boolean: - return false as any; - - case Array: - return [] as any; - - default: - return undefined; - } -} - /** * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. * Values of these types don't need special conversion. @@ -50,19 +29,6 @@ export function isTypeTypedArray(type: Function): boolean .indexOf(type as any)); } -export function isPrimitiveValue(obj: any): boolean -{ - switch (typeof obj) - { - case "string": - case "number": - case "boolean": - return true; - default: - return (obj instanceof String || obj instanceof Number || obj instanceof Boolean); - } -} - export function isObject(value: any): value is Object { return typeof value === "object"; @@ -79,7 +45,7 @@ function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date); } -export function parseToJSObject(json: any, expectedType: Function): Object { +export function parseToJSObject(json: any, expectedType: Serializable): Object { if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { return json; diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index da011e9..0c54af2 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -5,10 +5,12 @@ import { injectMetadataInformation } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; import { ArrayTypeDescriptor, - ConcreteTypeDescriptor, - ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, + ensureTypeDescriptor, + MapTypeDescriptor, + SetTypeDescriptor, TypeDescriptor, } from "./type-descriptor"; +import { IndexedObject } from './types'; declare abstract class Reflect { @@ -41,30 +43,33 @@ export interface IJsonMemberOptions extends OptionsBase /** * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared. + * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly + * declared. * @param options Additional options. */ -export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; +export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; /** * Specifies that a property is part of the object when serializing. * This call signature requires ReflectDecorators and that the property type is always explicitly declared. */ -export function jsonMember(target: Object, propertyKey: string | symbol): void; +export function jsonMember(prototype: IndexedObject, propertyKey: string | symbol): void; -export function jsonMember(optionsOrTarget?: IJsonMemberOptions | Object, propKey?: string | symbol): PropertyDecorator | void -{ - if (optionsOrTarget instanceof Object && (typeof propKey === "string" || typeof propKey === "symbol")) +export function jsonMember( + optionsOrPrototype?: IJsonMemberOptions | IndexedObject, + propKey?: string | symbol, +): PropertyDecorator | void { + if (propKey && (typeof propKey === "string" || typeof propKey === "symbol")) { - const target = optionsOrTarget as Object; + const prototype = optionsOrPrototype as IndexedObject; // For error messages. - const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(propKey)}`; + const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // jsonMember used directly, no additional information directly available besides target and propKey. // Obtain property constructor through ReflectDecorators. if (isReflectMetadataSupported) { - const reflectPropCtor = Reflect.getMetadata("design:type", target, propKey) as Function; + const reflectPropCtor = Reflect.getMetadata("design:type", prototype, propKey) as Function; if (!reflectPropCtor) { @@ -78,7 +83,7 @@ export function jsonMember(optionsOrTarget?: IJsonMe return; } - injectMetadataInformation(target, propKey, { + injectMetadataInformation(prototype, propKey, { type: typeDescriptor, key: propKey.toString(), name: propKey.toString(), @@ -95,7 +100,7 @@ export function jsonMember(optionsOrTarget?: IJsonMe // jsonMember used as a decorator factory. return (target: Object, _propKey: string | symbol) => { - let options: IJsonMemberOptions = optionsOrTarget || {}; + let options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {}; let typeDescriptor: TypeDescriptor|undefined; let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages. diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index 2ffa41c..4dcd342 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -1,6 +1,5 @@ -import { Constructor, ParameterlessConstructor } from "./types"; -import { METADATA_FIELD_KEY } from "./helpers"; -import { JsonObjectMetadata } from "./metadata"; +import { Serializable } from "./types"; +import { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from "./metadata"; import { extractOptionBase, OptionsBase } from "./options-base"; export type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; @@ -8,10 +7,20 @@ export type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; export interface IJsonObjectOptionsBase extends OptionsBase { /** - * An array of known types to recognize when encountering type-hints, - * or the name of a static method used for determining known types. + * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Function[] | string; + knownTypes?: Function[]; + + /** + * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. + */ + typeHintEmitter?: TypeHintEmitter; + + /** + * A function that given a source object will resolve the type that should be instantiated. + * It will override the global type resolver. + */ + typeResolver?: TypeResolver; /** * The name of a static or instance method to call when deserialization @@ -58,21 +67,21 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase * settings. The 'initializer' setting must be specified. * @param options Configuration settings. */ -export function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void; +export function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => void; /** * Marks that a class is serializable using TypedJSON, with additional settings. * @param options Configuration settings. */ -export function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void; +export function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void; /** * Marks that a class with a parameterless constructor is serializable using TypedJSON. */ -export function jsonObject(target: ParameterlessConstructor): void; +export function jsonObject(target: Serializable): void; -export function jsonObject(optionsOrTarget?: IJsonObjectOptions | Constructor -): ((target: Constructor) => void) | void { +export function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable +): ((target: Serializable) => void) | void { let options: IJsonObjectOptions; if (typeof optionsOrTarget === "function") @@ -87,46 +96,25 @@ export function jsonObject(optionsOrTarget?: IJsonObjectOption } function decorator( - target: Function + target: Serializable ): void { - let objectMetadata: JsonObjectMetadata; - // Create or obtain JsonObjectMetadata object. - if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY)) - { - // Target has no JsonObjectMetadata associated with it yet, create it now. - objectMetadata = new JsonObjectMetadata(target); - - // Inherit json members and known types from parent @jsonObject (if any). - const parentMetadata: JsonObjectMetadata = target.prototype[METADATA_FIELD_KEY]; - if (parentMetadata) - { - parentMetadata.dataMembers - .forEach((memberMetadata, propKey) => - objectMetadata.dataMembers.set(propKey, memberMetadata)); - parentMetadata.knownTypes - .forEach((knownType) => objectMetadata.knownTypes.add(knownType)); - } - - Object.defineProperty(target.prototype, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata - }); - } - else - { - // Target already has JsonObjectMetadata associated with it. - objectMetadata = target.prototype[METADATA_FIELD_KEY]; - objectMetadata.classType = target; - } + let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype); // Fill JsonObjectMetadata. objectMetadata.isExplicitlyMarked = true; objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - + + if (options.typeResolver) + { + objectMetadata.typeResolver = options.typeResolver; + } + if (options.typeHintEmitter) + { + objectMetadata.typeHintEmitter = options.typeHintEmitter; + } + // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer as any; if (options.name) @@ -139,12 +127,7 @@ export function jsonObject(optionsOrTarget?: IJsonObjectOption objectMetadata.options = optionsBase; } - // Obtain known-types. - if (typeof options.knownTypes === "string") - { - objectMetadata.knownTypeMethodName = options.knownTypes; - } - else if (options.knownTypes instanceof Array) + if (options.knownTypes) { options.knownTypes .filter(knownType => !!knownType) @@ -163,3 +146,7 @@ export function jsonObject(optionsOrTarget?: IJsonObjectOption return decorator; } } + +function isSubClass(target: Serializable) { + return +} diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index 462a122..e8bff8d 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -1,8 +1,19 @@ -import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from "./helpers"; -import { IndexedObject } from "./types"; +import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from "./helpers"; +import { IndexedObject, Serializable } from "./types"; import { OptionsBase } from "./options-base"; import { TypeDescriptor } from "./type-descriptor"; +export const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; + +export type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null; +export type TypeHintEmitter + = ( + targetObject: IndexedObject, + sourceObject: IndexedObject, + expectedSourceType: Function, + sourceTypeMetadata?: JsonObjectMetadata, + ) => void; + export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ @@ -14,7 +25,7 @@ export interface JsonMemberMetadata /** Property or field key of the json member. */ key: string; - /** Constuctor (type) reference of the member. */ + /** Type descriptor of the member. */ type?: TypeDescriptor; /** If set, indicates that the member must be present when deserializing. */ @@ -46,7 +57,7 @@ export class JsonObjectMetadata * Gets jsonObject metadata information from a class. * @param ctor The constructor class. */ - public static getFromConstructor(ctor: Function): JsonObjectMetadata|undefined + public static getFromConstructor(ctor: Serializable): JsonObjectMetadata|undefined { const prototype = ctor.prototype; if (!prototype) @@ -77,6 +88,36 @@ export class JsonObjectMetadata } } + public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata + { + if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { + return prototype[METADATA_FIELD_KEY]; + } + // Target has no JsonObjectMetadata associated with it yet, create it now. + const objectMetadata = new JsonObjectMetadata(prototype.constructor); + + // Inherit json members and known types from parent @jsonObject (if any). + const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY]; + if (parentMetadata) + { + parentMetadata.dataMembers + .forEach((memberMetadata, propKey) => + objectMetadata.dataMembers.set(propKey, memberMetadata)); + parentMetadata.knownTypes + .forEach((knownType) => objectMetadata.knownTypes.add(knownType)); + objectMetadata.typeResolver = parentMetadata.typeResolver; + objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; + } + + Object.defineProperty(prototype, METADATA_FIELD_KEY, { + enumerable: false, + configurable: false, + writable: false, + value: objectMetadata + }); + return objectMetadata; + } + /** * Gets the known type name of a jsonObject class for type hint. * @param constructor The constructor class. @@ -100,11 +141,14 @@ export class JsonObjectMetadata this.classType = classType; } - public dataMembers: Map = new Map(); + public dataMembers = new Map(); - public knownTypes: Set = new Set(); - - public knownTypeMethodName?: string; + /** Set of known types used for polymorphic deserialization */ + public knownTypes = new Set>(); + /** If present override the global function */ + public typeHintEmitter?: TypeHintEmitter; + /** If present override the global function */ + public typeResolver?: TypeResolver; /** Gets or sets the constructor function for the jsonObject. */ public classType: Function; @@ -133,15 +177,14 @@ export class JsonObjectMetadata public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; } -export function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) +export function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) { - const decoratorName = `@jsonMember on ${nameof(constructor.constructor)}.${String(propKey)}`; // For error messages. - let objectMetadata: JsonObjectMetadata; + const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages. // When a property decorator is applied to a static member, 'constructor' is a constructor function. // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. - if (typeof constructor === "function") + if (typeof prototype === "function") { logError(`${decoratorName}: cannot use a static property.`); return; @@ -149,7 +192,7 @@ export function injectMetadataInformation(constructor: IndexedObject, propKey: s // Methods cannot be serialized. // @ts-ignore symbol indexing is not supported by ts - if (typeof constructor[propKey] === "function") + if (typeof prototype[propKey] === "function") { logError(`${decoratorName}: cannot use a method property.`); return; @@ -163,31 +206,7 @@ export function injectMetadataInformation(constructor: IndexedObject, propKey: s // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well. - if (!constructor.hasOwnProperty(METADATA_FIELD_KEY)) - { - // No *own* metadata, create new. - objectMetadata = new JsonObjectMetadata(constructor.constructor); - - // Inherit @JsonMembers from parent @jsonObject (if any). - const parentMetadata: JsonObjectMetadata = constructor[METADATA_FIELD_KEY]; - if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY) - { - parentMetadata.dataMembers.forEach((_metadata, _propKey) => objectMetadata.dataMembers.set(_propKey, _metadata)); - } - - // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype). - Object.defineProperty(constructor, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata - }); - } - else - { - // JsonObjectMetadata already exists on 'constructor'. - objectMetadata = constructor[METADATA_FIELD_KEY]; - } + const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype); if (!metadata.deserializer) { diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 1968c67..2d87ac0 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -7,7 +7,7 @@ nameof, } from "./helpers"; import { IndexedObject } from "./types"; -import { JsonObjectMetadata } from "./metadata"; +import { JsonObjectMetadata, TypeHintEmitter } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; import { ArrayTypeDescriptor, @@ -18,15 +18,7 @@ import { TypeDescriptor, } from "./type-descriptor"; -export type TypeHintEmitter - = ( - targetObject: IndexedObject, - sourceObject: IndexedObject, - expectedSourceType: Function, - sourceTypeMetadata?: JsonObjectMetadata, - ) => void; - -function defaultTypeEmitter( +export function defaultTypeEmitter( targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, @@ -149,6 +141,7 @@ export class Serializer ) { let sourceTypeMetadata: JsonObjectMetadata|undefined; let targetObject: IndexedObject; + let typeHintEmitter = this._typeHintEmitter; if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { @@ -191,6 +184,10 @@ export class Serializer targetObject = {}; const classOptions = mergeOptions(this.options, sourceMeta.options); + if (sourceMeta.typeHintEmitter) + { + typeHintEmitter = sourceMeta.typeHintEmitter; + } sourceMeta.dataMembers.forEach((objMemberMetadata) => { @@ -227,7 +224,7 @@ export class Serializer } // Add type-hint. - this._typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); + typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); return targetObject; } @@ -341,7 +338,7 @@ export class Serializer typeDescriptor: MapTypeDescriptor, memberName = "object", memberOptions?: OptionsBase, - ): IndexedObject|Array<{ key: any, value: any }> { + ): IndexedObject | { key: any, value: any }[] { if (!typeDescriptor.valueType) { throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); diff --git a/src/typedjson/types.ts b/src/typedjson/types.ts index eafe8ed..0a1f0a2 100644 --- a/src/typedjson/types.ts +++ b/src/typedjson/types.ts @@ -1,3 +1,9 @@ export type IndexedObject = Object & { [key: string]: any }; + +export interface AbstractType extends Function +{ + prototype: T; +} + export type Constructor = new (...args: any[]) => T; -export type ParameterlessConstructor = new () => T; +export type Serializable = Constructor | AbstractType; From 0a58761ab5284bd257ed5828204575f4be72a979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Mon, 27 Jul 2020 00:04:07 +0200 Subject: [PATCH 008/119] Replace if-else with type strategy --- src/parser.ts | 12 +- src/typedjson/deserializer.ts | 1077 +++++++++++++++++---------------- src/typedjson/helpers.ts | 4 + src/typedjson/serializer.ts | 599 +++++++++--------- 4 files changed, 897 insertions(+), 795 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 73876b0..5175d91 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -369,7 +369,7 @@ export class TypedJSON public parseAsArray(object: any, dimensions: number = 1): any[] { const json = parseToJSObject(object, Array); - return this.deserializer.convertAsArray(json, + return this.deserializer.convertSingleValue(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes), ); @@ -378,7 +378,7 @@ export class TypedJSON public parseAsSet(object: any): Set { const json = parseToJSObject(object, Set); - return this.deserializer.convertAsSet(json, + return this.deserializer.convertSingleValue(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes) ); @@ -387,7 +387,7 @@ export class TypedJSON public parseAsMap(object: any, keyConstructor: Serializable): Map { const json = parseToJSObject(object, Map); - return this.deserializer.convertAsMap( + return this.deserializer.convertSingleValue( json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes), @@ -423,7 +423,7 @@ export class TypedJSON { try { - return this.serializer.convertAsArray( + return this.serializer.convertSingleValue( object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); } catch (e) @@ -436,7 +436,7 @@ export class TypedJSON { try { - return this.serializer.convertAsSet(object, SetT(this.rootConstructor)); + return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); } catch (e) { @@ -449,7 +449,7 @@ export class TypedJSON ): IndexedObject | { key: any, value: any }[] | undefined { try { - return this.serializer.convertAsMap(object, MapT(keyConstructor, this.rootConstructor)); + return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); } catch (e) { diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 81b771a..3037c2b 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -1,5 +1,5 @@ -import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from "./helpers"; -import { Constructor, IndexedObject } from "./types"; +import { isSubtypeOf, isValueDefined, logError, nameof } from "./helpers"; +import { Constructor, IndexedObject, Serializable } from "./types"; import { JsonObjectMetadata, TypeResolver } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; import { @@ -17,6 +17,15 @@ export function defaultTypeResolver( if (sourceObject.__type) return knownTypes.get(sourceObject.__type); } +export type DeserializerFn = ( + sourceObject: Raw, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, + deserializer: Deserializer, + memberOptions?: OptionsBase, +) => T; + /** * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. * It is used after parsing a JSON-string. @@ -25,13 +34,35 @@ export class Deserializer { public options?: OptionsBase; - private _typeResolver: TypeResolver = defaultTypeResolver; - private _nameResolver?: (ctor: Function) => string; - private _errorHandler: (error: Error) => void = logError; + private typeResolver: TypeResolver = defaultTypeResolver; + private nameResolver?: (ctor: Function) => string; + private errorHandler: (error: Error) => void = logError; + private deserializationStrategy = new Map, DeserializerFn>([ + // primitives + [Number, deserializeDirectly], + [String, deserializeDirectly], + [Boolean, deserializeDirectly], + + [Date, deserializeDate], + [ArrayBuffer, stringToArrayBuffer], + [DataView, stringToDataView], + + [Array, convertAsArray], + [Set, convertAsSet], + [Map, convertAsMap], + + // typed arrays + [Float32Array, convertAsFloatArray], + [Float64Array, convertAsFloatArray], + [Uint8Array, convertAsUintArray], + [Uint8ClampedArray, convertAsUintArray], + [Uint16Array, convertAsUintArray], + [Uint32Array, convertAsUintArray], + ]); public setNameResolver(nameResolverCallback: (ctor: Function) => string) { - this._nameResolver = nameResolverCallback; + this.nameResolver = nameResolverCallback; } public setTypeResolver(typeResolverCallback: TypeResolver) @@ -41,7 +72,12 @@ export class Deserializer throw new TypeError("'typeResolverCallback' is not a function."); } - this._typeResolver = typeResolverCallback; + this.typeResolver = typeResolverCallback; + } + + public getTypeResolver(): TypeResolver + { + return this.typeResolver; } public setErrorHandler(errorHandlerCallback: (error: Error) => void) @@ -51,629 +87,656 @@ export class Deserializer throw new TypeError("'errorHandlerCallback' is not a function."); } - this._errorHandler = errorHandlerCallback; + this.errorHandler = errorHandlerCallback; } - public convertAsObject( - sourceObject: IndexedObject, - typeDescriptor: ConcreteTypeDescriptor, + public getErrorHandler(): (error: Error) => void + { + return this.errorHandler; + } + + public convertSingleValue( + sourceObject: any, + typeDescriptor: TypeDescriptor, knownTypes: Map, - objectName = "object", + memberName = "object", memberOptions?: OptionsBase, - ) { - if (typeof sourceObject !== "object" || sourceObject === null) + ): any { + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - this._errorHandler(new TypeError(`Cannot deserialize ${objectName}: 'sourceObject' must be a defined object.`)); - return undefined; + return null; } - - let expectedSelfType = typeDescriptor.ctor; - let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType); - let knownTypeConstructors = knownTypes; - let typeResolver = this._typeResolver; - - if (sourceObjectMetadata) + else if (!isValueDefined(sourceObject)) { - // Merge known types received from "above" with known types defined on the current type. - knownTypeConstructors = this._mergeKnownTypes( - knownTypeConstructors, - this._createKnownTypesMap(sourceObjectMetadata.knownTypes), - ); - if (sourceObjectMetadata.typeResolver) - { - typeResolver = sourceObjectMetadata.typeResolver; - } + return; } - // Check if a type-hint is available from the source object. - const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - - if (typeFromTypeHint) + const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); + if (deserializer) { - // Check if type hint is a valid subtype of the expected source type. - if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) - { - // Hell yes. - expectedSelfType = typeFromTypeHint; - sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - - if (sourceObjectMetadata) - { - // Also merge new known types from subtype. - knownTypeConstructors = this._mergeKnownTypes( - knownTypeConstructors, - this._createKnownTypesMap(sourceObjectMetadata.knownTypes), - ); - } - } + return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); } - if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) + if (typeof sourceObject === "object") { - const sourceMetadata = sourceObjectMetadata; - // Strong-typed deserialization available, get to it. - // First deserialize properties into a temporary object. - const sourceObjectWithDeserializedProperties = {} as IndexedObject; + return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); + } + this.errorHandler(new TypeError( + `Could not deserialize '${memberName}': don't know how to deserialize this type'.`), + ); + } + + public instantiateType(ctor: any) + { + return new ctor(); + } - const classOptions = mergeOptions(this.options, sourceMetadata.options); + public mergeKnownTypes(...knownTypeMaps: Array>) + { + let result = new Map(); - // Deserialize by expected properties. - sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => + knownTypeMaps.forEach(knownTypes => + { + knownTypes.forEach((ctor, name) => { - const objMemberValue = sourceObject[propKey]; - const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`; - const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); - - let revivedValue; - if (objMemberMetadata.deserializer) + if (this.nameResolver) { - revivedValue = objMemberMetadata.deserializer(objMemberValue); - } - else if (objMemberMetadata.type) - { - revivedValue = this.convertSingleValue( - objMemberValue, - objMemberMetadata.type, - knownTypeConstructors, - objMemberDebugName, - objMemberOptions, - ); + result.set(this.nameResolver(ctor), ctor); } else { - throw new TypeError( - `Cannot deserialize ${objMemberDebugName} there is` - + ` no constructor nor deserialization function to use.`, - ); - } - - if (isValueDefined(revivedValue) - || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null) - ) { - sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue; - } - else if (objMemberMetadata.isRequired) - { - this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`)); + result.set(name, ctor); } }); + }); - // Next, instantiate target object. - let targetObject: IndexedObject; + return result; + } - if (typeof sourceObjectMetadata.initializerCallback === "function") - { - try - { - targetObject = sourceObjectMetadata.initializerCallback( - sourceObjectWithDeserializedProperties, - sourceObject, - ); + public createKnownTypesMap(knowTypes: Set) + { + const map = new Map(); - // Check the validity of user-defined initializer callback. - if (!targetObject) - { - throw new TypeError( - `Cannot deserialize ${objectName}:` - + ` 'initializer' function returned undefined/null` - + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`, - ); - } - else if (!(targetObject instanceof sourceObjectMetadata.classType)) - { - throw new TypeError( - `Cannot deserialize ${objectName}:` - + `'initializer' returned '${nameof(targetObject.constructor)}'` - + `, but '${nameof(sourceObjectMetadata.classType)}' was expected` - + `, and '${nameof(targetObject.constructor)}' is not a subtype of` - + ` '${nameof(sourceObjectMetadata.classType)}'`, - ); - } - } - catch (e) - { - this._errorHandler(e); - return undefined; - } + knowTypes.forEach(ctor => + { + if (this.nameResolver) + { + map.set(this.nameResolver(ctor), ctor); } else { - targetObject = this._instantiateType(expectedSelfType); + const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor); + const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name + ? knownTypeMeta.name + : ctor.name; + map.set(name, ctor); } + }); - // Finally, assign deserialized properties to target object. - Object.assign(targetObject, sourceObjectWithDeserializedProperties); + return map; + } - // Call onDeserialized method (if any). - if (sourceObjectMetadata.onDeserializedMethodName) - { - // check for member first - if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") - { - (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName](); - } - // check for static - else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") - { - (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName](); - } - else - { - this._errorHandler(new TypeError( - `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.` - )); - } - } + private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { + return (expectedShape === MapShape.ARRAY && Array.isArray(source)) + || (expectedShape === MapShape.OBJECT && typeof source === "object"); + } - return targetObject; - } - else - { - // Untyped deserialization into Object instance. - const targetObject = {} as IndexedObject; + public retrievePreserveNull(memberOptions?: OptionsBase): boolean + { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + } +} - Object.keys(sourceObject).forEach(sourceKey => - { - targetObject[sourceKey] = this.convertSingleValue( - sourceObject[sourceKey], - new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), - knownTypes, - sourceKey - ); - }); +function throwTypeMismatchError( + targetType: string, + expectedSourceType: string, + actualSourceType: string, + memberName: string, +): never { + throw new TypeError( + `Could not deserialize ${memberName} as ${targetType}:` + + ` expected ${expectedSourceType}, got ${actualSourceType}.`, + ); +} - return targetObject; - } +function makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) +{ + const expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; + const actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; + + return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`; +} + +function srcTypeNameForDebug(sourceObject: any) { + return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; +} + +function deserializeDirectly( + sourceObject: T, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + objectName: string, +): T { + if (sourceObject.constructor !== typeDescriptor.ctor) + { + throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); } + return sourceObject; +} - public convertSingleValue( - sourceObject: any, - typeDescriptor: TypeDescriptor, - knownTypes: Map, - memberName = "object", - memberOptions?: OptionsBase, - ) { - const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor; - let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : "undefined"; +function convertAsObject( + sourceObject: IndexedObject, + typeDescriptor: ConcreteTypeDescriptor, + knownTypes: Map, + memberName: string, + deserializer: Deserializer, +): IndexedObject|T|undefined { + if (typeof sourceObject !== "object" || sourceObject === null) + { + deserializer.getErrorHandler()( + new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`) + ); + return undefined; + } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) + let expectedSelfType = typeDescriptor.ctor; + let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType); + let knownTypeConstructors = knownTypes; + let typeResolver = deserializer.getTypeResolver(); + + if (sourceObjectMetadata) + { + // Merge known types received from "above" with known types defined on the current type. + knownTypeConstructors = deserializer.mergeKnownTypes( + knownTypeConstructors, + deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes), + ); + if (sourceObjectMetadata.typeResolver) { - return null; + typeResolver = sourceObjectMetadata.typeResolver; } - else if (!isValueDefined(sourceObject)) + } + + // Check if a type-hint is available from the source object. + const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); + + if (typeFromTypeHint) + { + // Check if type hint is a valid subtype of the expected source type. + if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { - return; + // Hell yes. + expectedSelfType = typeFromTypeHint; + sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint); + + if (sourceObjectMetadata) + { + // Also merge new known types from subtype. + knownTypeConstructors = deserializer.mergeKnownTypes( + knownTypeConstructors, + deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes), + ); + } } - else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor)) + } + + if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) + { + const sourceMetadata = sourceObjectMetadata; + // Strong-typed deserialization available, get to it. + // First deserialize properties into a temporary object. + const sourceObjectWithDeserializedProperties = {} as IndexedObject; + + const classOptions = mergeOptions(deserializer.options, sourceMetadata.options); + + // Deserialize by expected properties. + sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => { - if (sourceObject.constructor === typeDescriptor.ctor) + const objMemberValue = sourceObject[propKey]; + const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`; + const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); + + let revivedValue; + if (objMemberMetadata.deserializer) { - return sourceObject; + revivedValue = objMemberMetadata.deserializer(objMemberValue); } - else + else if (objMemberMetadata.type) { - throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName)); + revivedValue = deserializer.convertSingleValue( + objMemberValue, + objMemberMetadata.type, + knownTypeConstructors, + objMemberDebugName, + objMemberOptions, + ); } - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === Date) - { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). - // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - - if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) - return new Date(sourceObject as any); - else if (sourceObject instanceof Date) - return sourceObject else - this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array)) - { - // Deserialize Float Array from number[]. - return this._convertAsFloatArray( - sourceObject, - typeDescriptor as any, - srcTypeNameForDebug, - memberName, - ); - } - else if ( - expectedTypeIsConcrete && ( - typeDescriptor.ctor === Uint8Array - || typeDescriptor.ctor === Uint8ClampedArray - || typeDescriptor.ctor === Uint16Array - || typeDescriptor.ctor === Uint32Array - ) - ) { - // Deserialize Uint array from number[]. - return this._convertAsUintArray( - sourceObject, - typeDescriptor.ctor as any, - srcTypeNameForDebug, - memberName, - ); - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === ArrayBuffer) - { - if (typeof sourceObject === "string") - return this._stringToArrayBuffer(sourceObject); - else - this._throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === DataView) - { - if (typeof sourceObject === "string") - return this._stringToDataView(sourceObject); - else - this._throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug, memberName); - } - else if (typeDescriptor instanceof ArrayTypeDescriptor) - { - if (Array.isArray(sourceObject)) - return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - else - throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)); - } - else if (typeDescriptor instanceof SetTypeDescriptor) - { - if (Array.isArray(sourceObject)) - return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - else - this._throwTypeMismatchError("Set", "Array", srcTypeNameForDebug, memberName); - } - else if (typeDescriptor instanceof MapTypeDescriptor) - { - if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape)) { - return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); + throw new TypeError( + `Cannot deserialize ${objMemberDebugName} there is` + + ` no constructor nor deserialization function to use.`, + ); } - else + + if (isValueDefined(revivedValue) + || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null) + ) { + sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue; + } + else if (objMemberMetadata.isRequired) { - this._throwTypeMismatchError("Map", "a source array of key-value-pair objects", srcTypeNameForDebug, memberName); + deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`)); } - } - else if (sourceObject && typeof sourceObject === "object") - { - return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - } - } + }); - public convertAsArray( - sourceObject: any, - typeDescriptor: ArrayTypeDescriptor, - knownTypes: Map, - memberName = "object", - memberOptions?: OptionsBase, - ): any[] { - if (!(Array.isArray(sourceObject))) - { - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return []; - } + // Next, instantiate target object. + let targetObject: IndexedObject; - if (!typeDescriptor.elementType) + if (typeof sourceObjectMetadata.initializerCallback === "function") { - this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`)); - return []; - } - - return sourceObject.map(element => { - // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty - // entries, as an Array is ordered. try { - return this.convertSingleValue( - element, - typeDescriptor.elementType, - knownTypes, - `${memberName}[]`, - memberOptions, + targetObject = sourceObjectMetadata.initializerCallback( + sourceObjectWithDeserializedProperties, + sourceObject, ); + + // Check the validity of user-defined initializer callback. + if (!targetObject) + { + throw new TypeError( + `Cannot deserialize ${memberName}:` + + ` 'initializer' function returned undefined/null` + + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`, + ); + } + else if (!(targetObject instanceof sourceObjectMetadata.classType)) + { + throw new TypeError( + `Cannot deserialize ${memberName}:` + + `'initializer' returned '${nameof(targetObject.constructor)}'` + + `, but '${nameof(sourceObjectMetadata.classType)}' was expected` + + `, and '${nameof(targetObject.constructor)}' is not a subtype of` + + ` '${nameof(sourceObjectMetadata.classType)}'`, + ); + } } catch (e) { - this._errorHandler(e); - - // Keep filling the array here with undefined to keep original ordering. - // Note: this is just aesthetics, not returning anything produces the same result. + deserializer.getErrorHandler()(e); return undefined; } - }); - } - - public convertAsSet( - sourceObject: any, - typeDescriptor: SetTypeDescriptor, - knownTypes: Map, - memberName = "object", - memberOptions?: OptionsBase, - ): Set { - if (!(Array.isArray(sourceObject))) - { - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return new Set(); } - - if (!typeDescriptor.elementType) + else { - this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`)); - return new Set(); + targetObject = deserializer.instantiateType(expectedSelfType); } - const resultSet = new Set(); + // Finally, assign deserialized properties to target object. + Object.assign(targetObject, sourceObjectWithDeserializedProperties); - sourceObject.forEach((element, i) => { - try + // Call onDeserialized method (if any). + if (sourceObjectMetadata.onDeserializedMethodName) + { + // check for member first + if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") { - resultSet.add(this.convertSingleValue( - element, - typeDescriptor.elementType, - knownTypes, - `${memberName}[${i}]`, - memberOptions, - )); + (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName](); } - catch (e) + // check for static + else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") { - // Faulty entries are skipped, because a Set is not ordered, and skipping an entry - // does not affect others. - this._errorHandler(e); + (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName](); } - }); + else + { + deserializer.getErrorHandler()(new TypeError( + `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.` + )); + } + } - return resultSet; + return targetObject; } + else + { + // Untyped deserialization into Object instance. + const targetObject = {} as IndexedObject; - public convertAsMap( - sourceObject: any, - typeDescriptor: MapTypeDescriptor, - knownTypes: Map, - memberName = "object", - memberOptions?: OptionsBase, - ): Map { - const expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!this.isExpectedMapShape(sourceObject, expectedShape)) + Object.keys(sourceObject).forEach(sourceKey => { - const expectedType = expectedShape === MapShape.ARRAY ? Array : Object; - this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); - return new Map(); - } + targetObject[sourceKey] = deserializer.convertSingleValue( + sourceObject[sourceKey], + new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), + knownTypes, + sourceKey + ); + }); - if (!typeDescriptor.keyType) - { - this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`)); - return new Map(); - } + return targetObject; + } +} - if (!typeDescriptor.valueType) - { - this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`)); - return new Map(); - } +function convertAsArray( + sourceObject: any, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, + deserializer: Deserializer, + memberOptions?: OptionsBase, +): any[] { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) + { + throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); + } + if (!(Array.isArray(sourceObject))) + { + deserializer.getErrorHandler()( + new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)), + ); + return []; + } - const resultMap = new Map(); + if (!typeDescriptor.elementType) + { + deserializer.getErrorHandler()( + new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`), + ); + return []; + } - if (expectedShape === MapShape.OBJECT) + return sourceObject.map(element => { + // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty + // entries, as an Array is ordered. + try { - Object.keys(sourceObject).forEach(key => { - try - { - const resultKey = this.convertSingleValue( - key, - typeDescriptor.keyType, - knownTypes, - memberName, - memberOptions, - ); - if (isValueDefined(resultKey)) - { - resultMap.set( - resultKey, - this.convertSingleValue( - sourceObject[key], - typeDescriptor.valueType, - knownTypes, - `${memberName}[${resultKey}]`, - memberOptions, - ), - ); - } - } - catch (e) - { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - this._errorHandler(e); - } - }) + return deserializer.convertSingleValue( + element, + typeDescriptor.elementType, + knownTypes, + `${memberName}[]`, + memberOptions, + ); } - else + catch (e) { - sourceObject.forEach((element: any) => { - try - { - const key = this.convertSingleValue( - element.key, - typeDescriptor.keyType, - knownTypes, - memberName, - memberOptions, - ); + deserializer.getErrorHandler()(e); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) - { - resultMap.set( - key, - this.convertSingleValue( - element.value, - typeDescriptor.valueType, - knownTypes, - `${memberName}[${key}]`, - memberOptions, - ), - ); - } - } - catch (e) - { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - this._errorHandler(e); - } - }); + // Keep filling the array here with undefined to keep original ordering. + // Note: this is just aesthetics, not returning anything produces the same result. + return undefined; } + }); +} - return resultMap; +function convertAsSet( + sourceObject: any, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, + deserializer: Deserializer, + memberOptions?: OptionsBase, +): Set { + if (!(typeDescriptor instanceof SetTypeDescriptor)) + { + throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); } - - private _convertAsFloatArray( - sourceObject: any, - arrayType: Constructor, - srcTypeNameForDebug: string, - memberName: string, - ): T { - if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) - return new arrayType(sourceObject); - return this._throwTypeMismatchError( - arrayType.name, - "a numeric source array", - srcTypeNameForDebug, - memberName, - ); + if (!(Array.isArray(sourceObject))) + { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return new Set(); } - private _convertAsUintArray( - sourceObject: any, - arrayType: Constructor, - srcTypeNameForDebug: string, - memberName: string, - ): T { - if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) - return new arrayType(sourceObject.map(value => ~~value)); - return this._throwTypeMismatchError( - arrayType.name, - "a numeric source array", - srcTypeNameForDebug, - memberName, + if (!typeDescriptor.elementType) + { + deserializer.getErrorHandler()( + new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`), ); + return new Set(); } - private _throwTypeMismatchError( - targetType: string, - expectedSourceType: string, - actualSourceType: string, - memberName: string, - ): never { - throw new TypeError( - `Could not deserialize ${memberName} as ${targetType}:` - + ` expected ${expectedSourceType}, got ${actualSourceType}.`, + const resultSet = new Set(); + + sourceObject.forEach((element, i) => { + try + { + resultSet.add(deserializer.convertSingleValue( + element, + typeDescriptor.elementType, + knownTypes, + `${memberName}[${i}]`, + memberOptions, + )); + } + catch (e) + { + // Faulty entries are skipped, because a Set is not ordered, and skipping an entry + // does not affect others. + deserializer.getErrorHandler()(e); + } + }); + + return resultSet; +} + +function isExpectedMapShape(source: any, expectedShape: MapShape): boolean { + return (expectedShape === MapShape.ARRAY && Array.isArray(source)) + || (expectedShape === MapShape.OBJECT && typeof source === "object"); +} + +function convertAsMap( + sourceObject: any, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, + deserializer: Deserializer, + memberOptions?: OptionsBase, +): Map { + if (!(typeDescriptor instanceof MapTypeDescriptor)) + { + throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); + } + const expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!isExpectedMapShape(sourceObject, expectedShape)) + { + const expectedType = expectedShape === MapShape.ARRAY ? Array : Object; + deserializer.getErrorHandler()( + new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)), ); + return new Map(); } - private _makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) + if (!typeDescriptor.keyType) { - const expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; - const actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; - - return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`; + deserializer.getErrorHandler()( + new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`), + ); + return new Map(); } - private _instantiateType(ctor: any) + if (!typeDescriptor.valueType) { - return new ctor(); + deserializer.getErrorHandler()( + new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`), + ); + return new Map(); } - private _mergeKnownTypes(...knownTypeMaps: Array>) - { - let result = new Map(); + const resultMap = new Map(); - knownTypeMaps.forEach(knownTypes => - { - knownTypes.forEach((ctor, name) => + if (expectedShape === MapShape.OBJECT) + { + Object.keys(sourceObject).forEach(key => { + try { - if (this._nameResolver) - { - result.set(this._nameResolver(ctor), ctor); - } - else + const resultKey = deserializer.convertSingleValue( + key, + typeDescriptor.keyType, + knownTypes, + memberName, + memberOptions, + ); + if (isValueDefined(resultKey)) { - result.set(name, ctor); + resultMap.set( + resultKey, + deserializer.convertSingleValue( + sourceObject[key], + typeDescriptor.valueType, + knownTypes, + `${memberName}[${resultKey}]`, + memberOptions, + ), + ); } - }); - }); - - return result; + } + catch (e) + { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }) } - - private _createKnownTypesMap(knowTypes: Set) + else { - const map = new Map(); - - knowTypes.forEach(ctor => - { - if (this._nameResolver) + sourceObject.forEach((element: any) => { + try { - map.set(this._nameResolver(ctor), ctor); + const key = deserializer.convertSingleValue( + element.key, + typeDescriptor.keyType, + knownTypes, + memberName, + memberOptions, + ); + + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) + { + resultMap.set( + key, + deserializer.convertSingleValue( + element.value, + typeDescriptor.valueType, + knownTypes, + `${memberName}[${key}]`, + memberOptions, + ), + ); + } } - else + catch (e) { - const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor); - const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name - ? knownTypeMeta.name - : ctor.name; - map.set(name, ctor); + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); } }); - - return map; } - private _stringToArrayBuffer(str: string) + return resultMap; +} + +function deserializeDate( + sourceObject: string | number | Date, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, +): Date { + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). + // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime + + if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) { - let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char - let bufView = new Uint16Array(buf); + return new Date(sourceObject as any); + } + else if (sourceObject instanceof Date) + { + return sourceObject + } + else + { + throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug(sourceObject), memberName); + } +} - for (let i = 0, strLen = str.length; i < strLen; i++) - { - bufView[i] = str.charCodeAt(i); - } +function stringToArrayBuffer( + sourceObject: string | number | Date, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, +) { + if (typeof sourceObject !== "string") + { + throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug(sourceObject), memberName); + } + return createArrayBufferFromString(sourceObject); +} - return buf; +function stringToDataView( + sourceObject: string | number | Date, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, +) { + if (typeof sourceObject !== "string") + { + throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug(sourceObject), memberName); } + return new DataView(createArrayBufferFromString(sourceObject)); +} + +function createArrayBufferFromString(input: string): ArrayBuffer { + let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char + let bufView = new Uint16Array(buf); - private _stringToDataView(str: string) + for (let i = 0, strLen = input.length; i < strLen; i++) { - return new DataView(this._stringToArrayBuffer(str)); + bufView[i] = input.charCodeAt(i); } - private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { - return (expectedShape === MapShape.ARRAY && Array.isArray(source)) - || (expectedShape === MapShape.OBJECT && typeof source === "object"); + return buf; +} + +function convertAsFloatArray( + sourceObject: string | number | Date, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, +): T { + const constructor = typeDescriptor.ctor as Constructor; + if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) + { + return new constructor(sourceObject); } + return throwTypeMismatchError( + constructor.name, + "a numeric source array", + srcTypeNameForDebug(sourceObject), + memberName, + ); +} - private retrievePreserveNull(memberOptions?: OptionsBase): boolean +function convertAsUintArray( + sourceObject: string | number | Date, + typeDescriptor: TypeDescriptor, + knownTypes: Map, + memberName: string, +): T { + const constructor = typeDescriptor.ctor as Constructor; + if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + return new constructor(sourceObject.map(value => ~~value)); } + return throwTypeMismatchError( + typeDescriptor.ctor.name, + "a numeric source array", + srcTypeNameForDebug(sourceObject), + memberName, + ); } diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 6a9e8d6..4270a49 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -141,3 +141,7 @@ export function nameof(fn: Function & { name?: string }) } return "undefined"; } + +export function identity(arg: T): T { + return arg; +} diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 2d87ac0..c107c8b 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -1,12 +1,11 @@ import { - isDirectlySerializableNativeType, + identity, isInstanceOf, - isTypeTypedArray, isValueDefined, logError, nameof, } from "./helpers"; -import { IndexedObject } from "./types"; +import { IndexedObject, Serializable } from "./types"; import { JsonObjectMetadata, TypeHintEmitter } from "./metadata"; import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; import { @@ -35,6 +34,21 @@ export function defaultTypeEmitter( } } +/** + * @param sourceObject The original object that should be serialized. + * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization. + * @param memberName Name of the object being serialized, used for debugging purposes. + * @param serializer Serializer instance, aiding with recursive serialization. + * @param memberOptions If converted as a member, the member options. + */ +export type SerializerFn = ( + sourceObject: T, + typeDescriptor: TD, + memberName: string, + serializer: Serializer, + memberOptions?: OptionsBase, +) => Raw; + /** * 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 called "simple javascript object"), @@ -48,8 +62,33 @@ export function defaultTypeEmitter( export class Serializer { public options?: OptionsBase; - private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter; - private _errorHandler: (error: Error) => void = logError; + private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter; + private errorHandler: (error: Error) => void = logError; + private serializationStrategy = new Map, SerializerFn>([ + // primitives + [Date, identity], + [Number, identity], + [String, identity], + [Boolean, identity], + + [ArrayBuffer, convertAsArrayBuffer], + [DataView, convertAsDataView], + + [Array, convertAsArray], + [Set, convertAsSet], + [Map, convertAsMap], + + // typed arrays + [Float32Array, convertAsTypedArray], + [Float64Array, convertAsTypedArray], + [Int8Array, convertAsTypedArray], + [Uint8Array, convertAsTypedArray], + [Uint8ClampedArray, convertAsTypedArray], + [Int16Array, convertAsTypedArray], + [Uint16Array, convertAsTypedArray], + [Int32Array, convertAsTypedArray], + [Uint32Array, convertAsTypedArray], + ]); public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) { @@ -58,7 +97,12 @@ export class Serializer throw new TypeError("'typeEmitterCallback' is not a function."); } - this._typeHintEmitter = typeEmitterCallback; + this.typeHintEmitter = typeEmitterCallback; + } + + public getTypeHintEmitter(): TypeHintEmitter + { + return this.typeHintEmitter; } public setErrorHandler(errorHandlerCallback: (error: Error) => void) @@ -68,7 +112,17 @@ export class Serializer throw new TypeError("'errorHandlerCallback' is not a function."); } - this._errorHandler = errorHandlerCallback; + this.errorHandler = errorHandlerCallback; + } + + public getErrorHandler(): (error: Error) => void + { + return this.errorHandler; + } + + public retrievePreserveNull(memberOptions?: OptionsBase): boolean + { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); } /** @@ -89,333 +143,314 @@ export class Serializer let expectedName = nameof(typeDescriptor.ctor); let actualName = nameof(sourceObject.constructor); - this._errorHandler(new TypeError( + this.errorHandler(new TypeError( `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`), ); return; } - if (isDirectlySerializableNativeType(typeDescriptor.ctor)) - { - return sourceObject; - } - else if (typeDescriptor.ctor === ArrayBuffer) - { - return this.convertAsArrayBuffer(sourceObject); - } - else if (typeDescriptor.ctor === DataView) - { - return this.convertAsDataView(sourceObject); + const serializer = this.serializationStrategy.get(typeDescriptor.ctor); + if (serializer) { + return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); } - else if (typeDescriptor instanceof ArrayTypeDescriptor) + // if not present in the strategy do property by property serialization + if (typeof sourceObject === "object") { - return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (typeDescriptor instanceof SetTypeDescriptor) - { - return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (typeDescriptor instanceof MapTypeDescriptor) - { - return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (isTypeTypedArray(typeDescriptor.ctor)) - { - return this.convertAsTypedArray(sourceObject); - } - else if (typeof sourceObject === "object") - { - return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions); + return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); } + this.errorHandler(new TypeError( + `Could not serialize '${memberName}': don't know how to serialize this type'.`), + ); } +} - /** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ - public convertAsObject( - sourceObject: IndexedObject, - typeDescriptor: ConcreteTypeDescriptor, - memberName?: string, - memberOptions?: OptionsBase, - ) { - let sourceTypeMetadata: JsonObjectMetadata|undefined; - let targetObject: IndexedObject; - let typeHintEmitter = this._typeHintEmitter; +/** + * Performs the conversion of a typed object (usually a class instance) to a simple + * javascript object for serialization. + */ +function convertAsObject( + sourceObject: IndexedObject, + typeDescriptor: ConcreteTypeDescriptor, + memberName: string, + serializer: Serializer, + memberOptions?: OptionsBase, +) { + let sourceTypeMetadata: JsonObjectMetadata|undefined; + let targetObject: IndexedObject; + let typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) - { - // The source object is not of the expected type, but it is a valid subtype. - // This is OK, and we'll proceed to gather object metadata from the subtype instead. - sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else - { - sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); - } + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) + { + // The source object is not of the expected type, but it is a valid subtype. + // This is OK, and we'll proceed to gather object metadata from the subtype instead. + sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor); + } + else + { + sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); + } - if (sourceTypeMetadata) - { + if (sourceTypeMetadata) + { - if (sourceTypeMetadata.beforeSerializationMethodName) { - // check for member first - if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") - { - (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName](); - } - // check for static - else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") - { - (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName](); - } - else - { - this._errorHandler(new TypeError( - `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.` - )); - } + if (sourceTypeMetadata.beforeSerializationMethodName) { + // check for member first + if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") + { + (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName](); } - - const sourceMeta = sourceTypeMetadata; - // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), - // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', - // which is what will be put into 'JSON.stringify' finally. - targetObject = {}; - - const classOptions = mergeOptions(this.options, sourceMeta.options); - if (sourceMeta.typeHintEmitter) + // check for static + else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") { - typeHintEmitter = sourceMeta.typeHintEmitter; + (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName](); } - - sourceMeta.dataMembers.forEach((objMemberMetadata) => + else { - const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); - let serialized; - if (objMemberMetadata.serializer) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } else if (objMemberMetadata.type) { - serialized = this.convertSingleValue( - sourceObject[objMemberMetadata.key], - objMemberMetadata.type, - `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`, - objMemberOptions, - ); - } else { - throw new TypeError( - `Could not serialize ${objMemberMetadata.name}, there is` - + ` no constructor nor serialization function to use.`, - ); - } - - if (isValueDefined(serialized) - || (this.retrievePreserveNull(objMemberOptions) && serialized === null) - ) { - targetObject[objMemberMetadata.name] = serialized; - } - }); - } - else - { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = { ...sourceObject }; + serializer.getErrorHandler()(new TypeError( + `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.` + )); + } } - // Add type-hint. - typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - - return targetObject; - } + const sourceMeta = sourceTypeMetadata; + // Strong-typed serialization available. + // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), + // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', + // which is what will be put into 'JSON.stringify' finally. + targetObject = {}; - /** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for - * serialization. - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - public convertAsArray( - sourceObject: any[], - typeDescriptor: ArrayTypeDescriptor, - memberName = "object", - memberOptions?: OptionsBase, - ): any[] { - if (!typeDescriptor.elementType) + const classOptions = mergeOptions(serializer.options, sourceMeta.options); + if (sourceMeta.typeHintEmitter) { - throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); + typeHintEmitter = sourceMeta.typeHintEmitter; } - // Check the type of each element, individually. - // If at least one array element type is incorrect, we return undefined, which results in no - // value emitted during serialization. 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 - // the emitted array. - sourceObject.forEach((element, i) => + sourceMeta.dataMembers.forEach((objMemberMetadata) => { - if (!(this.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, typeDescriptor.elementType.ctor) + const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); + let serialized; + if (objMemberMetadata.serializer) { + serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); + } else if (objMemberMetadata.type) { + serialized = serializer.convertSingleValue( + sourceObject[objMemberMetadata.key], + objMemberMetadata.type, + `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`, + objMemberOptions, + ); + } else { + throw new TypeError( + `Could not serialize ${objMemberMetadata.name}, there is` + + ` no constructor nor serialization function to use.`, + ); + } + + if (isValueDefined(serialized) + || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null) ) { - const expectedTypeName = nameof(typeDescriptor.elementType.ctor); - const actualTypeName = element && nameof(element.constructor); - throw new TypeError(`Could not serialize ${memberName}[${i}]:` + - ` expected '${expectedTypeName}', got '${actualTypeName}'.`); + targetObject[objMemberMetadata.name] = serialized; } }); + } + else + { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = { ...sourceObject }; + } - if (memberName) - { - // Just for debugging purposes. - memberName += "[]"; - } + // Add type-hint. + typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - return sourceObject.map( - element => this.convertSingleValue( - element, typeDescriptor.elementType, memberName, memberOptions - ), - ); - } + return targetObject; +} - /** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * - * @param sourceObject - * @param expectedElementType The constructor of the expected Set elements - * (e.g. `Number` for `Set`, or `MyClass` for `Set`). - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - * @returns - */ - public convertAsSet( - sourceObject: Set, - typeDescriptor: SetTypeDescriptor, - memberName = "object", - memberOptions?: OptionsBase, - ): any[] { - if (!typeDescriptor.elementType) - { - throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`); - } +/** + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects + * (or primitive values) for serialization. + */ +function convertAsArray( + sourceObject: any[], + typeDescriptor: TypeDescriptor, + memberName:string , + serializer: Serializer, + memberOptions?: OptionsBase, +): any[] { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) + { + throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); + } + if (!typeDescriptor.elementType) + { + throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); + } - // For debugging and error tracking. - if (memberName) - { - memberName += "[]"; + // Check the type of each element, individually. + // If at least one array element type is incorrect, we return undefined, which results in no + // value emitted during serialization. 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 + // the emitted array. + sourceObject.forEach((element, i) => + { + if (!(serializer.retrievePreserveNull(memberOptions) && element === null) + && !isInstanceOf(element, typeDescriptor.elementType.ctor) + ) { + const expectedTypeName = nameof(typeDescriptor.elementType.ctor); + const actualTypeName = element && nameof(element.constructor); + throw new TypeError(`Could not serialize ${memberName}[${i}]:` + + ` expected '${expectedTypeName}', got '${actualTypeName}'.`); } + }); - let resultArray: any[] = []; + if (memberName) + { + // Just for debugging purposes. + memberName += "[]"; + } - // Convert each element of the set, and put it into an output array. - // The output array is the one serialized, as JSON.stringify does not support Set serialization. - // (TODO: clarification needed) - sourceObject.forEach(element => - { - const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + return sourceObject.map( + element => serializer.convertSingleValue( + element, typeDescriptor.elementType, memberName, memberOptions + ), + ); +} - // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became undefined - // DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) - { - resultArray.push(resultElement); - } - }); +/** + * Performs the conversion of a set of typed objects (or primitive values) into an array + * of simple javascript objects. + * @returns + */ +function convertAsSet( + sourceObject: Set, + typeDescriptor: TypeDescriptor, + memberName: string, + serializer: Serializer, + memberOptions?: OptionsBase, +): any[] { + if (!(typeDescriptor instanceof SetTypeDescriptor)) + { + throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); + } + if (!typeDescriptor.elementType) + { + throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`); + } - return resultArray; + // For debugging and error tracking. + if (memberName) + { + memberName += "[]"; } - /** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - * - * @param sourceObject - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - public convertAsMap( - sourceObject: Map, - typeDescriptor: MapTypeDescriptor, - memberName = "object", - memberOptions?: OptionsBase, - ): IndexedObject | { key: any, value: any }[] { - if (!typeDescriptor.valueType) - { - throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); - } + let resultArray: any[] = []; - if (!typeDescriptor.keyType) - { - throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`); - } + // Convert each element of the set, and put it into an output array. + // The output array is the one serialized, as JSON.stringify does not support Set serialization. + // (TODO: clarification needed) + sourceObject.forEach(element => + { + const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - if (memberName) + // Add to output if the source element was undefined, OR the converted element is defined. + // This will add intentionally undefined values to output, but not values that became undefined + // DURING serializing (usually because of a type-error). + if (!isValueDefined(element) || isValueDefined(resultElement)) { - memberName += "[]"; + resultArray.push(resultElement); } + }); - // const resultArray: Array<{ key: any, value: any }> = []; - const resultShape = typeDescriptor.getCompleteOptions().shape; - const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : []; - const preserveNull = this.retrievePreserveNull(memberOptions); - - // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach((value, key) => - { - let resultKeyValuePairObj = { - key: this.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), - }; - - // We are not going to emit entries with undefined keys OR undefined values. - const keyDefined = isValueDefined(resultKeyValuePairObj.key); - const valueDefined = isValueDefined(resultKeyValuePairObj.value) - || (resultKeyValuePairObj.value === null && preserveNull); - if (keyDefined && valueDefined) - { - if (resultShape === MapShape.OBJECT) { - result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; - } else { - result.push(resultKeyValuePairObj); - } - } - }); + return resultArray; +} - return result; +/** + * Performs the conversion of a map of typed objects (or primitive values) into an array + * of simple javascript objects with `key` and `value` properties. + */ +function convertAsMap( + sourceObject: Map, + typeDescriptor: TypeDescriptor, + memberName: string, + serializer: Serializer, + memberOptions?: OptionsBase, +): IndexedObject | { key: any, value: any }[] { + if (!(typeDescriptor instanceof MapTypeDescriptor)) + { + throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` + + ' proper annotation or function for this type'); } - - /** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - * - * @param sourceObject - * @returns - */ - public convertAsTypedArray(sourceObject: ArrayBufferView) + if (!typeDescriptor.valueType) { - return Array.from(sourceObject as any); + throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); } - /** - * Performs the conversion of a raw ArrayBuffer to a string. - */ - public convertAsArrayBuffer(buffer: ArrayBuffer) + if (!typeDescriptor.keyType) { - // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(""); + throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`); } - /** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ - public convertAsDataView(dataView: DataView) + if (memberName) { - return this.convertAsArrayBuffer(dataView.buffer); + memberName += "[]"; } - private retrievePreserveNull(memberOptions?: OptionsBase): boolean { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - } + // const resultArray: Array<{ key: any, value: any }> = []; + const resultShape = typeDescriptor.getCompleteOptions().shape; + const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : []; + const preserveNull = serializer.retrievePreserveNull(memberOptions); + + // Convert each *entry* in the map to a simple javascript object with key and value properties. + sourceObject.forEach((value, key) => + { + let resultKeyValuePairObj = { + key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + }; + + // We are not going to emit entries with undefined keys OR undefined values. + const keyDefined = isValueDefined(resultKeyValuePairObj.key); + const valueDefined = isValueDefined(resultKeyValuePairObj.value) + || (resultKeyValuePairObj.value === null && preserveNull); + if (keyDefined && valueDefined) + { + if (resultShape === MapShape.OBJECT) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; + } else { + result.push(resultKeyValuePairObj); + } + } + }); + + return result; +} + +/** + * Performs the conversion of a typed javascript array to a simple untyped javascript array. + * This is needed because typed arrays are otherwise serialized as objects, so we'll end up + * with something like "{ 0: 0, 1: 1, ... }". + */ +function convertAsTypedArray(sourceObject: ArrayBufferView) +{ + return Array.from(sourceObject as any); +} + +/** + * Performs the conversion of a raw ArrayBuffer to a string. + */ +function convertAsArrayBuffer(buffer: ArrayBuffer) +{ + // ArrayBuffer -> 16-bit character codes -> character array -> joined string. + return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(""); +} + +/** + * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and + * returning that string. + */ +function convertAsDataView(dataView: DataView) +{ + return convertAsArrayBuffer(dataView.buffer); } From 7c88c2dfb2b7ab936e2276be1ceace04dfdc3eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Mon, 27 Jul 2020 00:05:24 +0200 Subject: [PATCH 009/119] 1.6.0-rc2 --- js/parser.d.ts | 69 +- js/typedjson.d.ts | 3 +- js/typedjson.js | 1279 ++++++++++++++++---------------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 +- js/typedjson.min.js.map | 2 +- js/typedjson/deserializer.d.ts | 33 +- js/typedjson/helpers.d.ts | 9 +- js/typedjson/json-member.d.ts | 8 +- js/typedjson/json-object.d.ts | 23 +- js/typedjson/metadata.d.ts | 20 +- js/typedjson/serializer.d.ts | 77 +- js/typedjson/types.d.ts | 5 +- package-lock.json | 2 +- package.json | 2 +- 15 files changed, 751 insertions(+), 787 deletions(-) diff --git a/js/parser.d.ts b/js/parser.d.ts index 8123df7..402e78c 100644 --- a/js/parser.d.ts +++ b/js/parser.d.ts @@ -1,9 +1,10 @@ -import { Constructor, IndexedObject } from "./typedjson/types"; -import { TypeHintEmitter } from "./typedjson/serializer"; -import { TypeResolver } from "./typedjson/deserializer"; +import { Constructor, IndexedObject, Serializable } from "./typedjson/types"; +import { defaultTypeEmitter } from "./typedjson/serializer"; +import { defaultTypeResolver } from "./typedjson/deserializer"; +import { TypeResolver, TypeHintEmitter } from "./typedjson/metadata"; import { OptionsBase } from "./typedjson/options-base"; export declare type JsonTypes = Object | boolean | string | number | null | undefined; -export { TypeResolver, TypeHintEmitter }; +export { defaultTypeResolver, defaultTypeEmitter }; export interface ITypedJSONSettings extends OptionsBase { /** * Sets the handler callback to invoke on errors during serializing and deserializing. @@ -35,35 +36,35 @@ export interface ITypedJSONSettings extends OptionsBase { knownTypes?: Array>; } export declare class TypedJSON { - static parse(object: any, rootType: Constructor, settings?: ITypedJSONSettings): T | undefined; - static parseAsArray(object: any, elementType: Constructor, settings?: ITypedJSONSettings, dimensions?: 1): T[]; - static parseAsArray(object: any, elementType: Constructor, settings: ITypedJSONSettings | undefined, dimensions: 2): T[][]; - static parseAsArray(object: any, elementType: Constructor, settings: ITypedJSONSettings | undefined, dimensions: 3): T[][][]; - static parseAsArray(object: any, elementType: Constructor, settings: ITypedJSONSettings | undefined, dimensions: 4): T[][][][]; - static parseAsArray(object: any, elementType: Constructor, settings: ITypedJSONSettings | undefined, dimensions: 5): T[][][][][]; - static parseAsSet(object: any, elementType: Constructor, settings?: ITypedJSONSettings): Set; - static parseAsMap(object: any, keyType: Constructor, valueType: Constructor, settings?: ITypedJSONSettings): Map; - static toPlainJson(object: T, rootType: Constructor, settings?: ITypedJSONSettings): JsonTypes; - static toPlainArray(object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings): Object[]; - static toPlainArray(object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings): Object[][]; - static toPlainArray(object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings): Object[][][]; - static toPlainArray(object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings): Object[][][][]; - static toPlainArray(object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings): Object[][][][][]; - static toPlainArray(object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings): any[]; - static toPlainSet(object: Set, elementType: Constructor, settings?: ITypedJSONSettings): Object[] | undefined; - static toPlainMap(object: Map, keyCtor: Constructor, valueCtor: Constructor, settings?: ITypedJSONSettings): IndexedObject | { + static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined; + static parseAsArray(object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1): T[]; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 2): T[][]; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 3): T[][][]; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 4): T[][][][]; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 5): T[][][][][]; + static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set; + static parseAsMap(object: any, keyType: Serializable, valueType: Serializable, settings?: ITypedJSONSettings): Map; + static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes; + static toPlainArray(object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): Object[]; + static toPlainArray(object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): Object[][]; + static toPlainArray(object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): Object[][][]; + static toPlainArray(object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): Object[][][][]; + static toPlainArray(object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): Object[][][][][]; + static toPlainArray(object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): any[]; + static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Object[] | undefined; + static toPlainMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): IndexedObject | { key: any; value: any; }[] | undefined; - static stringify(object: T, rootType: Constructor, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings): string; - static stringifyAsSet(object: Set, elementType: Constructor, settings?: ITypedJSONSettings): string; - static stringifyAsMap(object: Map, keyCtor: Constructor, valueCtor: Constructor, settings?: ITypedJSONSettings): string; + static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): string; + static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string; + static stringifyAsMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): string; private static _globalConfig; static setGlobalConfig(config: ITypedJSONSettings): void; private serializer; @@ -80,7 +81,7 @@ export declare class TypedJSON { * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ - constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings); + constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings); /** * Configures TypedJSON through a settings object. * @param settings The configuration settings object. @@ -100,7 +101,7 @@ export declare class TypedJSON { parseAsArray(object: any, dimensions: 5): T[][][][][]; parseAsArray(object: any, dimensions: number): any[]; parseAsSet(object: any): Set; - parseAsMap(object: any, keyConstructor: Constructor): Map; + parseAsMap(object: any, keyConstructor: Serializable): Map; /** * Converts an instance of the specified class type to a plain JSON object. * @param object The instance to convert to a JSON string. @@ -113,7 +114,7 @@ export declare class TypedJSON { toPlainArray(object: T[][][][], dimensions: 4): Object[][][][]; toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][]; toPlainSet(object: Set): Object[] | undefined; - toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject | { + toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | { key: any; value: any; }[] | undefined; @@ -131,6 +132,6 @@ export declare class TypedJSON { stringifyAsArray(object: T[][][][], dimensions: 4): string; stringifyAsArray(object: T[][][][][], dimensions: 5): string; stringifyAsSet(object: Set): string; - stringifyAsMap(object: Map, keyConstructor: Constructor): string; + stringifyAsMap(object: Map, keyConstructor: Serializable): string; private _mapKnownTypes; } diff --git a/js/typedjson.d.ts b/js/typedjson.d.ts index ec14b16..7474d41 100644 --- a/js/typedjson.d.ts +++ b/js/typedjson.d.ts @@ -1,4 +1,5 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from "./parser"; +export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from "./parser"; +export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from "./typedjson/metadata"; export { jsonObject } from "./typedjson/json-object"; export { jsonMember } from "./typedjson/json-member"; export { jsonArrayMember } from "./typedjson/json-array-member"; diff --git a/js/typedjson.js b/js/typedjson.js index a4a65a5..becd255 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.6.0-rc1 - 2020-07-15 +// [typedjson] Version: 1.6.0-rc2 - 2020-07-27 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -110,23 +110,8 @@ var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { r[k] = a[j]; return r; }; -var METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + ' and "emitDecoratorMetadata" in your tsconfig.json?'; -function getDefaultValue(type) { - switch (type) { - case Number: - return 0; - case String: - return ""; - case Boolean: - return false; - case Array: - return []; - default: - return undefined; - } -} /** * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. * Values of these types don't need special conversion. @@ -142,16 +127,6 @@ function isTypeTypedArray(type) { return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] .indexOf(type)); } -function isPrimitiveValue(obj) { - switch (typeof obj) { - case "string": - case "number": - case "boolean": - return true; - default: - return (obj instanceof String || obj instanceof Number || obj instanceof Boolean); - } -} function isObject(value) { return typeof value === "object"; } @@ -243,13 +218,18 @@ function nameof(fn) { } return "undefined"; } +function identity(arg) { + return arg; +} // CONCATENATED MODULE: ./src/typedjson/metadata.ts +var METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; var metadata_JsonObjectMetadata = /** @class */ (function () { //#endregion function JsonObjectMetadata(classType) { this.dataMembers = new Map(); + /** Set of known types used for polymorphic deserialization */ this.knownTypes = new Set(); /** * Indicates whether this class was explicitly annotated with @jsonObject @@ -298,6 +278,32 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { return primitiveMeta; } }; + JsonObjectMetadata.ensurePresentInPrototype = function (prototype) { + if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { + return prototype[METADATA_FIELD_KEY]; + } + // Target has no JsonObjectMetadata associated with it yet, create it now. + var objectMetadata = new JsonObjectMetadata(prototype.constructor); + // Inherit json members and known types from parent @jsonObject (if any). + var parentMetadata = prototype[METADATA_FIELD_KEY]; + if (parentMetadata) { + parentMetadata.dataMembers + .forEach(function (memberMetadata, propKey) { + return objectMetadata.dataMembers.set(propKey, memberMetadata); + }); + parentMetadata.knownTypes + .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); + objectMetadata.typeResolver = parentMetadata.typeResolver; + objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; + } + Object.defineProperty(prototype, METADATA_FIELD_KEY, { + enumerable: false, + configurable: false, + writable: false, + value: objectMetadata + }); + return objectMetadata; + }; /** * Gets the known type name of a jsonObject class for type hint. * @param constructor The constructor class. @@ -313,19 +319,18 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { return JsonObjectMetadata; }()); -function injectMetadataInformation(constructor, propKey, metadata) { - var decoratorName = "@jsonMember on " + nameof(constructor.constructor) + "." + String(propKey); // For error messages. - var objectMetadata; +function injectMetadataInformation(prototype, propKey, metadata) { + var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); // For error messages. // When a property decorator is applied to a static member, 'constructor' is a constructor function. // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. - if (typeof constructor === "function") { + if (typeof prototype === "function") { logError(decoratorName + ": cannot use a static property."); return; } // Methods cannot be serialized. // @ts-ignore symbol indexing is not supported by ts - if (typeof constructor[propKey] === "function") { + if (typeof prototype[propKey] === "function") { logError(decoratorName + ": cannot use a method property."); return; } @@ -335,27 +340,7 @@ function injectMetadataInformation(constructor, propKey, metadata) { } // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well. - if (!constructor.hasOwnProperty(METADATA_FIELD_KEY)) { - // No *own* metadata, create new. - objectMetadata = new metadata_JsonObjectMetadata(constructor.constructor); - // Inherit @JsonMembers from parent @jsonObject (if any). - var parentMetadata = constructor[METADATA_FIELD_KEY]; - if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY) - { - parentMetadata.dataMembers.forEach(function (_metadata, _propKey) { return objectMetadata.dataMembers.set(_propKey, _metadata); }); - } - // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype). - Object.defineProperty(constructor, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata - }); - } - else { - // JsonObjectMetadata already exists on 'constructor'. - objectMetadata = constructor[METADATA_FIELD_KEY]; - } + var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); if (!metadata.deserializer) { // @ts-ignore above is a check (!deser && !ctor) metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); @@ -553,20 +538,51 @@ function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sour */ var serializer_Serializer = /** @class */ (function () { function Serializer() { - this._typeHintEmitter = defaultTypeEmitter; - this._errorHandler = logError; + this.typeHintEmitter = defaultTypeEmitter; + this.errorHandler = logError; + this.serializationStrategy = new Map([ + // primitives + [Date, identity], + [Number, identity], + [String, identity], + [Boolean, identity], + [ArrayBuffer, convertAsArrayBuffer], + [DataView, convertAsDataView], + [Array, convertAsArray], + [Set, convertAsSet], + [Map, convertAsMap], + // typed arrays + [Float32Array, convertAsTypedArray], + [Float64Array, convertAsTypedArray], + [Int8Array, convertAsTypedArray], + [Uint8Array, convertAsTypedArray], + [Uint8ClampedArray, convertAsTypedArray], + [Int16Array, convertAsTypedArray], + [Uint16Array, convertAsTypedArray], + [Int32Array, convertAsTypedArray], + [Uint32Array, convertAsTypedArray], + ]); } Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { if (typeof typeEmitterCallback !== "function") { throw new TypeError("'typeEmitterCallback' is not a function."); } - this._typeHintEmitter = typeEmitterCallback; + this.typeHintEmitter = typeEmitterCallback; + }; + Serializer.prototype.getTypeHintEmitter = function () { + return this.typeHintEmitter; }; Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { if (typeof errorHandlerCallback !== "function") { throw new TypeError("'errorHandlerCallback' is not a function."); } - this._errorHandler = errorHandlerCallback; + this.errorHandler = errorHandlerCallback; + }; + Serializer.prototype.getErrorHandler = function () { + return this.errorHandler; + }; + Serializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); }; /** * Convert a value of any supported serializable type. @@ -581,243 +597,220 @@ var serializer_Serializer = /** @class */ (function () { if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { var expectedName = nameof(typeDescriptor.ctor); var actualName = nameof(sourceObject.constructor); - this._errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); return; } - if (isDirectlySerializableNativeType(typeDescriptor.ctor)) { - return sourceObject; + var serializer = this.serializationStrategy.get(typeDescriptor.ctor); + if (serializer) { + return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); } - else if (typeDescriptor.ctor === ArrayBuffer) { - return this.convertAsArrayBuffer(sourceObject); - } - else if (typeDescriptor.ctor === DataView) { - return this.convertAsDataView(sourceObject); - } - else if (typeDescriptor instanceof ArrayTypeDescriptor) { - return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (typeDescriptor instanceof SetTypeDescriptor) { - return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (typeDescriptor instanceof MapTypeDescriptor) { - return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions); - } - else if (isTypeTypedArray(typeDescriptor.ctor)) { - return this.convertAsTypedArray(sourceObject); - } - else if (typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions); + // if not present in the strategy do property by property serialization + if (typeof sourceObject === "object") { + return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); } + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); }; - /** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ - Serializer.prototype.convertAsObject = function (sourceObject, typeDescriptor, memberName, memberOptions) { - var _this = this; - var sourceTypeMetadata; - var targetObject; - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { - // The source object is not of the expected type, but it is a valid subtype. - // This is OK, and we'll proceed to gather object metadata from the subtype instead. - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else { - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); - } - if (sourceTypeMetadata) { - if (sourceTypeMetadata.beforeSerializationMethodName) { - // check for member first - if (typeof sourceObject[sourceTypeMetadata.beforeSerializationMethodName] === "function") { - sourceObject[sourceTypeMetadata.beforeSerializationMethodName](); - } - // check for static - else if (typeof sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName] === "function") { - sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName](); - } - else { - this._errorHandler(new TypeError("beforeSerialization callback '" + nameof(sourceTypeMetadata.classType) + "." + sourceTypeMetadata.beforeSerializationMethodName + "' is not a method.")); - } + return Serializer; +}()); + +/** + * Performs the conversion of a typed object (usually a class instance) to a simple + * javascript object for serialization. + */ +function convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + var sourceTypeMetadata; + var targetObject; + var typeHintEmitter = serializer.getTypeHintEmitter(); + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { + // The source object is not of the expected type, but it is a valid subtype. + // This is OK, and we'll proceed to gather object metadata from the subtype instead. + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); + } + else { + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); + } + if (sourceTypeMetadata) { + if (sourceTypeMetadata.beforeSerializationMethodName) { + // check for member first + if (typeof sourceObject[sourceTypeMetadata.beforeSerializationMethodName] === "function") { + sourceObject[sourceTypeMetadata.beforeSerializationMethodName](); } - var sourceMeta_1 = sourceTypeMetadata; - // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), - // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', - // which is what will be put into 'JSON.stringify' finally. - targetObject = {}; - var classOptions_1 = mergeOptions(this.options, sourceMeta_1.options); - sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var serialized; - if (objMemberMetadata.serializer) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } - else if (objMemberMetadata.type) { - serialized = _this.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); - } - else { - throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" - + " no constructor nor serialization function to use."); - } - if (isValueDefined(serialized) - || (_this.retrievePreserveNull(objMemberOptions) && serialized === null)) { - targetObject[objMemberMetadata.name] = serialized; - } - }); - } - else { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = __assign({}, sourceObject); - } - // Add type-hint. - this._typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - return targetObject; - }; - /** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for - * serialization. - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - Serializer.prototype.convertAsArray = function (sourceObject, typeDescriptor, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - if (!typeDescriptor.elementType) { - throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); - } - // Check the type of each element, individually. - // If at least one array element type is incorrect, we return undefined, which results in no - // value emitted during serialization. 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 - // the emitted array. - sourceObject.forEach(function (element, i) { - if (!(_this.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { - var expectedTypeName = nameof(typeDescriptor.elementType.ctor); - var actualTypeName = element && nameof(element.constructor); - throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + - (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); + // check for static + else if (typeof sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName] === "function") { + sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName](); + } + else { + serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + nameof(sourceTypeMetadata.classType) + "." + sourceTypeMetadata.beforeSerializationMethodName + "' is not a method.")); } - }); - if (memberName) { - // Just for debugging purposes. - memberName += "[]"; - } - return sourceObject.map(function (element) { return _this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); - }; - /** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * - * @param sourceObject - * @param expectedElementType The constructor of the expected Set elements - * (e.g. `Number` for `Set`, or `MyClass` for `Set`). - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - * @returns - */ - Serializer.prototype.convertAsSet = function (sourceObject, typeDescriptor, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - if (!typeDescriptor.elementType) { - throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); - } - // For debugging and error tracking. - if (memberName) { - memberName += "[]"; } - var resultArray = []; - // Convert each element of the set, and put it into an output array. - // The output array is the one serialized, as JSON.stringify does not support Set serialization. - // (TODO: clarification needed) - sourceObject.forEach(function (element) { - var resultElement = _this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became undefined - // DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) { - resultArray.push(resultElement); + var sourceMeta_1 = sourceTypeMetadata; + // Strong-typed serialization available. + // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), + // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', + // which is what will be put into 'JSON.stringify' finally. + targetObject = {}; + var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); + if (sourceMeta_1.typeHintEmitter) { + typeHintEmitter = sourceMeta_1.typeHintEmitter; + } + sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { + var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); + var serialized; + if (objMemberMetadata.serializer) { + serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); } - }); - return resultArray; - }; - /** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - * - * @param sourceObject - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - Serializer.prototype.convertAsMap = function (sourceObject, typeDescriptor, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - if (!typeDescriptor.valueType) { - throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); - } - if (!typeDescriptor.keyType) { - throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); - } - if (memberName) { - memberName += "[]"; - } - // const resultArray: Array<{ key: any, value: any }> = []; - var resultShape = typeDescriptor.getCompleteOptions().shape; - var result = resultShape === 1 /* OBJECT */ ? {} : []; - var preserveNull = this.retrievePreserveNull(memberOptions); - // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach(function (value, key) { - var resultKeyValuePairObj = { - key: _this.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: _this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), - }; - // We are not going to emit entries with undefined keys OR undefined values. - var keyDefined = isValueDefined(resultKeyValuePairObj.key); - var valueDefined = isValueDefined(resultKeyValuePairObj.value) - || (resultKeyValuePairObj.value === null && preserveNull); - if (keyDefined && valueDefined) { - if (resultShape === 1 /* OBJECT */) { - result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; - } - else { - result.push(resultKeyValuePairObj); - } + else if (objMemberMetadata.type) { + serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + } + else { + throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" + + " no constructor nor serialization function to use."); + } + if (isValueDefined(serialized) + || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)) { + targetObject[objMemberMetadata.name] = serialized; } }); - return result; - }; - /** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - * - * @param sourceObject - * @returns - */ - Serializer.prototype.convertAsTypedArray = function (sourceObject) { - return Array.from(sourceObject); - }; - /** - * Performs the conversion of a raw ArrayBuffer to a string. - */ - Serializer.prototype.convertAsArrayBuffer = function (buffer) { - // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(function (charCode) { return String.fromCharCode(charCode); }).join(""); - }; - /** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ - Serializer.prototype.convertAsDataView = function (dataView) { - return this.convertAsArrayBuffer(dataView.buffer); - }; - Serializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - return Serializer; -}()); - + } + else { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = __assign({}, sourceObject); + } + // Add type-hint. + typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); + return targetObject; +} +/** + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects + * (or primitive values) for serialization. + */ +function convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!typeDescriptor.elementType) { + throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); + } + // Check the type of each element, individually. + // If at least one array element type is incorrect, we return undefined, which results in no + // value emitted during serialization. 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 + // the emitted array. + sourceObject.forEach(function (element, i) { + if (!(serializer.retrievePreserveNull(memberOptions) && element === null) + && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { + var expectedTypeName = nameof(typeDescriptor.elementType.ctor); + var actualTypeName = element && nameof(element.constructor); + throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); + } + }); + if (memberName) { + // Just for debugging purposes. + memberName += "[]"; + } + return sourceObject.map(function (element) { return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); +} +/** + * Performs the conversion of a set of typed objects (or primitive values) into an array + * of simple javascript objects. + * @returns + */ +function convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!typeDescriptor.elementType) { + throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); + } + // For debugging and error tracking. + if (memberName) { + memberName += "[]"; + } + var resultArray = []; + // Convert each element of the set, and put it into an output array. + // The output array is the one serialized, as JSON.stringify does not support Set serialization. + // (TODO: clarification needed) + sourceObject.forEach(function (element) { + var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + // Add to output if the source element was undefined, OR the converted element is defined. + // This will add intentionally undefined values to output, but not values that became undefined + // DURING serializing (usually because of a type-error). + if (!isValueDefined(element) || isValueDefined(resultElement)) { + resultArray.push(resultElement); + } + }); + return resultArray; +} +/** + * Performs the conversion of a map of typed objects (or primitive values) into an array + * of simple javascript objects with `key` and `value` properties. + */ +function convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!typeDescriptor.valueType) { + throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); + } + if (!typeDescriptor.keyType) { + throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); + } + if (memberName) { + memberName += "[]"; + } + // const resultArray: Array<{ key: any, value: any }> = []; + var resultShape = typeDescriptor.getCompleteOptions().shape; + var result = resultShape === 1 /* OBJECT */ ? {} : []; + var preserveNull = serializer.retrievePreserveNull(memberOptions); + // Convert each *entry* in the map to a simple javascript object with key and value properties. + sourceObject.forEach(function (value, key) { + var resultKeyValuePairObj = { + key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + }; + // We are not going to emit entries with undefined keys OR undefined values. + var keyDefined = isValueDefined(resultKeyValuePairObj.key); + var valueDefined = isValueDefined(resultKeyValuePairObj.value) + || (resultKeyValuePairObj.value === null && preserveNull); + if (keyDefined && valueDefined) { + if (resultShape === 1 /* OBJECT */) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; + } + else { + result.push(resultKeyValuePairObj); + } + } + }); + return result; +} +/** + * Performs the conversion of a typed javascript array to a simple untyped javascript array. + * This is needed because typed arrays are otherwise serialized as objects, so we'll end up + * with something like "{ 0: 0, 1: 1, ... }". + */ +function convertAsTypedArray(sourceObject) { + return Array.from(sourceObject); +} +/** + * Performs the conversion of a raw ArrayBuffer to a string. + */ +function convertAsArrayBuffer(buffer) { + // ArrayBuffer -> 16-bit character codes -> character array -> joined string. + return Array.from(new Uint16Array(buffer)).map(function (charCode) { return String.fromCharCode(charCode); }).join(""); +} +/** + * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and + * returning that string. + */ +function convertAsDataView(dataView) { + return convertAsArrayBuffer(dataView.buffer); +} // CONCATENATED MODULE: ./src/typedjson/deserializer.ts @@ -834,334 +827,70 @@ function defaultTypeResolver(sourceObject, knownTypes) { */ var deserializer_Deserializer = /** @class */ (function () { function Deserializer() { - this._typeResolver = defaultTypeResolver; - this._errorHandler = logError; + this.typeResolver = defaultTypeResolver; + this.errorHandler = logError; + this.deserializationStrategy = new Map([ + // primitives + [Number, deserializeDirectly], + [String, deserializeDirectly], + [Boolean, deserializeDirectly], + [Date, deserializeDate], + [ArrayBuffer, stringToArrayBuffer], + [DataView, stringToDataView], + [Array, deserializer_convertAsArray], + [Set, deserializer_convertAsSet], + [Map, deserializer_convertAsMap], + // typed arrays + [Float32Array, convertAsFloatArray], + [Float64Array, convertAsFloatArray], + [Uint8Array, convertAsUintArray], + [Uint8ClampedArray, convertAsUintArray], + [Uint16Array, convertAsUintArray], + [Uint32Array, convertAsUintArray], + ]); } Deserializer.prototype.setNameResolver = function (nameResolverCallback) { - this._nameResolver = nameResolverCallback; + this.nameResolver = nameResolverCallback; }; Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { if (typeof typeResolverCallback !== "function") { throw new TypeError("'typeResolverCallback' is not a function."); } - this._typeResolver = typeResolverCallback; + this.typeResolver = typeResolverCallback; + }; + Deserializer.prototype.getTypeResolver = function () { + return this.typeResolver; }; Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { if (typeof errorHandlerCallback !== "function") { throw new TypeError("'errorHandlerCallback' is not a function."); } - this._errorHandler = errorHandlerCallback; + this.errorHandler = errorHandlerCallback; }; - Deserializer.prototype.convertAsObject = function (sourceObject, typeDescriptor, knownTypes, objectName, memberOptions) { - var _this = this; - if (objectName === void 0) { objectName = "object"; } - if (typeof sourceObject !== "object" || sourceObject === null) { - this._errorHandler(new TypeError("Cannot deserialize " + objectName + ": 'sourceObject' must be a defined object.")); - return undefined; - } - var expectedSelfType = typeDescriptor.ctor; - var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); - var knownTypeConstructors = knownTypes; - if (sourceObjectMetadata) { - // Merge known types received from "above" with known types defined on the current type. - knownTypeConstructors = this._mergeKnownTypes(knownTypeConstructors, this._createKnownTypesMap(sourceObjectMetadata.knownTypes)); - } - // Check if a type-hint is available from the source object. - var typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint) { - // Check if type hint is a valid subtype of the expected source type. - if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { - // Hell yes. - expectedSelfType = typeFromTypeHint; - sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata) { - // Also merge new known types from subtype. - knownTypeConstructors = this._mergeKnownTypes(knownTypeConstructors, this._createKnownTypesMap(sourceObjectMetadata.knownTypes)); - } - } - } - if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) { - var sourceMetadata_1 = sourceObjectMetadata; - // Strong-typed deserialization available, get to it. - // First deserialize properties into a temporary object. - var sourceObjectWithDeserializedProperties_1 = {}; - var classOptions_1 = mergeOptions(this.options, sourceMetadata_1.options); - // Deserialize by expected properties. - sourceMetadata_1.dataMembers.forEach(function (objMemberMetadata, propKey) { - var objMemberValue = sourceObject[propKey]; - var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var revivedValue; - if (objMemberMetadata.deserializer) { - revivedValue = objMemberMetadata.deserializer(objMemberValue); - } - else if (objMemberMetadata.type) { - revivedValue = _this.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); - } - else { - throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" - + " no constructor nor deserialization function to use."); - } - if (isValueDefined(revivedValue) - || (_this.retrievePreserveNull(objMemberOptions) && revivedValue === null)) { - sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; - } - else if (objMemberMetadata.isRequired) { - _this._errorHandler(new TypeError("Missing required member '" + objMemberDebugName + "'.")); - } - }); - // Next, instantiate target object. - var targetObject = void 0; - if (typeof sourceObjectMetadata.initializerCallback === "function") { - try { - targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); - // Check the validity of user-defined initializer callback. - if (!targetObject) { - throw new TypeError("Cannot deserialize " + objectName + ":" - + " 'initializer' function returned undefined/null" - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); - } - else if (!(targetObject instanceof sourceObjectMetadata.classType)) { - throw new TypeError("Cannot deserialize " + objectName + ":" - + ("'initializer' returned '" + nameof(targetObject.constructor) + "'") - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected") - + (", and '" + nameof(targetObject.constructor) + "' is not a subtype of") - + (" '" + nameof(sourceObjectMetadata.classType) + "'")); - } - } - catch (e) { - this._errorHandler(e); - return undefined; - } - } - else { - targetObject = this._instantiateType(expectedSelfType); - } - // Finally, assign deserialized properties to target object. - Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); - // Call onDeserialized method (if any). - if (sourceObjectMetadata.onDeserializedMethodName) { - // check for member first - if (typeof targetObject[sourceObjectMetadata.onDeserializedMethodName] === "function") { - targetObject[sourceObjectMetadata.onDeserializedMethodName](); - } - // check for static - else if (typeof targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName] === "function") { - targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName](); - } - else { - this._errorHandler(new TypeError("onDeserialized callback '" + nameof(sourceObjectMetadata.classType) + "." + sourceObjectMetadata.onDeserializedMethodName + "' is not a method.")); - } - } - return targetObject; - } - else { - // Untyped deserialization into Object instance. - var targetObject_1 = {}; - Object.keys(sourceObject).forEach(function (sourceKey) { - targetObject_1[sourceKey] = _this.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); - }); - return targetObject_1; - } + Deserializer.prototype.getErrorHandler = function () { + return this.errorHandler; }; Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { if (memberName === void 0) { memberName = "object"; } - var expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor; - var srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : "undefined"; if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { return null; } else if (!isValueDefined(sourceObject)) { return; } - else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor)) { - if (sourceObject.constructor === typeDescriptor.ctor) { - return sourceObject; - } - else { - throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName)); - } - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === Date) { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). - // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) - return new Date(sourceObject); - else if (sourceObject instanceof Date) - return sourceObject; - else - this._throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array)) { - // Deserialize Float Array from number[]. - return this._convertAsFloatArray(sourceObject, typeDescriptor, srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Uint8Array - || typeDescriptor.ctor === Uint8ClampedArray - || typeDescriptor.ctor === Uint16Array - || typeDescriptor.ctor === Uint32Array)) { - // Deserialize Uint array from number[]. - return this._convertAsUintArray(sourceObject, typeDescriptor.ctor, srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === ArrayBuffer) { - if (typeof sourceObject === "string") - return this._stringToArrayBuffer(sourceObject); - else - this._throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug, memberName); - } - else if (expectedTypeIsConcrete && typeDescriptor.ctor === DataView) { - if (typeof sourceObject === "string") - return this._stringToDataView(sourceObject); - else - this._throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug, memberName); - } - else if (typeDescriptor instanceof ArrayTypeDescriptor) { - if (Array.isArray(sourceObject)) - return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - else - throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)); - } - else if (typeDescriptor instanceof SetTypeDescriptor) { - if (Array.isArray(sourceObject)) - return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - else - this._throwTypeMismatchError("Set", "Array", srcTypeNameForDebug, memberName); - } - else if (typeDescriptor instanceof MapTypeDescriptor) { - if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape)) { - return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - } - else { - this._throwTypeMismatchError("Map", "a source array of key-value-pair objects", srcTypeNameForDebug, memberName); - } - } - else if (sourceObject && typeof sourceObject === "object") { - return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions); - } - }; - Deserializer.prototype.convertAsArray = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - if (!(Array.isArray(sourceObject))) { - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return []; + var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); + if (deserializer) { + return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); } - if (!typeDescriptor.elementType) { - this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); - return []; + if (typeof sourceObject === "object") { + return deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); } - return sourceObject.map(function (element) { - // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty - // entries, as an Array is ordered. - try { - return _this.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); - } - catch (e) { - _this._errorHandler(e); - // Keep filling the array here with undefined to keep original ordering. - // Note: this is just aesthetics, not returning anything produces the same result. - return undefined; - } - }); + this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); }; - Deserializer.prototype.convertAsSet = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - if (!(Array.isArray(sourceObject))) { - this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return new Set(); - } - if (!typeDescriptor.elementType) { - this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); - return new Set(); - } - var resultSet = new Set(); - sourceObject.forEach(function (element, i) { - try { - resultSet.add(_this.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); - } - catch (e) { - // Faulty entries are skipped, because a Set is not ordered, and skipping an entry - // does not affect others. - _this._errorHandler(e); - } - }); - return resultSet; - }; - Deserializer.prototype.convertAsMap = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - var _this = this; - if (memberName === void 0) { memberName = "object"; } - var expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!this.isExpectedMapShape(sourceObject, expectedShape)) { - var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; - this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); - return new Map(); - } - if (!typeDescriptor.keyType) { - this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); - return new Map(); - } - if (!typeDescriptor.valueType) { - this._errorHandler(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); - return new Map(); - } - var resultMap = new Map(); - if (expectedShape === 1 /* OBJECT */) { - Object.keys(sourceObject).forEach(function (key) { - try { - var resultKey = _this.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - if (isValueDefined(resultKey)) { - resultMap.set(resultKey, _this.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - _this._errorHandler(e); - } - }); - } - else { - sourceObject.forEach(function (element) { - try { - var key = _this.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) { - resultMap.set(key, _this.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - _this._errorHandler(e); - } - }); - } - return resultMap; - }; - Deserializer.prototype._convertAsFloatArray = function (sourceObject, arrayType, srcTypeNameForDebug, memberName) { - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) - return new arrayType(sourceObject); - return this._throwTypeMismatchError(arrayType.name, "a numeric source array", srcTypeNameForDebug, memberName); - }; - Deserializer.prototype._convertAsUintArray = function (sourceObject, arrayType, srcTypeNameForDebug, memberName) { - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) - return new arrayType(sourceObject.map(function (value) { return ~~value; })); - return this._throwTypeMismatchError(arrayType.name, "a numeric source array", srcTypeNameForDebug, memberName); - }; - Deserializer.prototype._throwTypeMismatchError = function (targetType, expectedSourceType, actualSourceType, memberName) { - throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" - + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); - }; - Deserializer.prototype._makeTypeErrorMessage = function (expectedType, actualType, memberName) { - var expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; - var actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; - return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "', got '" + actualTypeName + "'."; - }; - Deserializer.prototype._instantiateType = function (ctor) { + Deserializer.prototype.instantiateType = function (ctor) { return new ctor(); }; - Deserializer.prototype._mergeKnownTypes = function () { + Deserializer.prototype.mergeKnownTypes = function () { var _this = this; var knownTypeMaps = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -1170,8 +899,8 @@ var deserializer_Deserializer = /** @class */ (function () { var result = new Map(); knownTypeMaps.forEach(function (knownTypes) { knownTypes.forEach(function (ctor, name) { - if (_this._nameResolver) { - result.set(_this._nameResolver(ctor), ctor); + if (_this.nameResolver) { + result.set(_this.nameResolver(ctor), ctor); } else { result.set(name, ctor); @@ -1180,12 +909,12 @@ var deserializer_Deserializer = /** @class */ (function () { }); return result; }; - Deserializer.prototype._createKnownTypesMap = function (knowTypes) { + Deserializer.prototype.createKnownTypesMap = function (knowTypes) { var _this = this; var map = new Map(); knowTypes.forEach(function (ctor) { - if (_this._nameResolver) { - map.set(_this._nameResolver(ctor), ctor); + if (_this.nameResolver) { + map.set(_this.nameResolver(ctor), ctor); } else { var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); @@ -1197,17 +926,6 @@ var deserializer_Deserializer = /** @class */ (function () { }); return map; }; - Deserializer.prototype._stringToArrayBuffer = function (str) { - var buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char - var bufView = new Uint16Array(buf); - for (var i = 0, strLen = str.length; i < strLen; i++) { - bufView[i] = str.charCodeAt(i); - } - return buf; - }; - Deserializer.prototype._stringToDataView = function (str) { - return new DataView(this._stringToArrayBuffer(str)); - }; Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) || (expectedShape === 1 /* OBJECT */ && typeof source === "object"); @@ -1218,6 +936,295 @@ var deserializer_Deserializer = /** @class */ (function () { return Deserializer; }()); +function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { + throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" + + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); +} +function makeTypeErrorMessage(expectedType, actualType, memberName) { + var expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; + var actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; + return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "', got '" + actualTypeName + "'."; +} +function srcTypeNameForDebug(sourceObject) { + return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; +} +function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { + if (sourceObject.constructor !== typeDescriptor.ctor) { + throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); + } + return sourceObject; +} +function deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { + if (typeof sourceObject !== "object" || sourceObject === null) { + deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); + return undefined; + } + var expectedSelfType = typeDescriptor.ctor; + var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); + var knownTypeConstructors = knownTypes; + var typeResolver = deserializer.getTypeResolver(); + if (sourceObjectMetadata) { + // Merge known types received from "above" with known types defined on the current type. + knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); + if (sourceObjectMetadata.typeResolver) { + typeResolver = sourceObjectMetadata.typeResolver; + } + } + // Check if a type-hint is available from the source object. + var typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); + if (typeFromTypeHint) { + // Check if type hint is a valid subtype of the expected source type. + if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { + // Hell yes. + expectedSelfType = typeFromTypeHint; + sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); + if (sourceObjectMetadata) { + // Also merge new known types from subtype. + knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); + } + } + } + if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) { + var sourceMetadata_1 = sourceObjectMetadata; + // Strong-typed deserialization available, get to it. + // First deserialize properties into a temporary object. + var sourceObjectWithDeserializedProperties_1 = {}; + var classOptions_1 = mergeOptions(deserializer.options, sourceMetadata_1.options); + // Deserialize by expected properties. + sourceMetadata_1.dataMembers.forEach(function (objMemberMetadata, propKey) { + var objMemberValue = sourceObject[propKey]; + var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; + var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); + var revivedValue; + if (objMemberMetadata.deserializer) { + revivedValue = objMemberMetadata.deserializer(objMemberValue); + } + else if (objMemberMetadata.type) { + revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); + } + else { + throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" + + " no constructor nor deserialization function to use."); + } + if (isValueDefined(revivedValue) + || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)) { + sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; + } + else if (objMemberMetadata.isRequired) { + deserializer.getErrorHandler()(new TypeError("Missing required member '" + objMemberDebugName + "'.")); + } + }); + // Next, instantiate target object. + var targetObject = void 0; + if (typeof sourceObjectMetadata.initializerCallback === "function") { + try { + targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); + // Check the validity of user-defined initializer callback. + if (!targetObject) { + throw new TypeError("Cannot deserialize " + memberName + ":" + + " 'initializer' function returned undefined/null" + + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); + } + else if (!(targetObject instanceof sourceObjectMetadata.classType)) { + throw new TypeError("Cannot deserialize " + memberName + ":" + + ("'initializer' returned '" + nameof(targetObject.constructor) + "'") + + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected") + + (", and '" + nameof(targetObject.constructor) + "' is not a subtype of") + + (" '" + nameof(sourceObjectMetadata.classType) + "'")); + } + } + catch (e) { + deserializer.getErrorHandler()(e); + return undefined; + } + } + else { + targetObject = deserializer.instantiateType(expectedSelfType); + } + // Finally, assign deserialized properties to target object. + Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); + // Call onDeserialized method (if any). + if (sourceObjectMetadata.onDeserializedMethodName) { + // check for member first + if (typeof targetObject[sourceObjectMetadata.onDeserializedMethodName] === "function") { + targetObject[sourceObjectMetadata.onDeserializedMethodName](); + } + // check for static + else if (typeof targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName] === "function") { + targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName](); + } + else { + deserializer.getErrorHandler()(new TypeError("onDeserialized callback '" + nameof(sourceObjectMetadata.classType) + "." + sourceObjectMetadata.onDeserializedMethodName + "' is not a method.")); + } + } + return targetObject; + } + else { + // Untyped deserialization into Object instance. + var targetObject_1 = {}; + Object.keys(sourceObject).forEach(function (sourceKey) { + targetObject_1[sourceKey] = deserializer.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); + }); + return targetObject_1; + } +} +function deserializer_convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!(Array.isArray(sourceObject))) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return []; + } + if (!typeDescriptor.elementType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); + return []; + } + return sourceObject.map(function (element) { + // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty + // entries, as an Array is ordered. + try { + return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); + } + catch (e) { + deserializer.getErrorHandler()(e); + // Keep filling the array here with undefined to keep original ordering. + // Note: this is just aesthetics, not returning anything produces the same result. + return undefined; + } + }); +} +function deserializer_convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!(Array.isArray(sourceObject))) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return new Set(); + } + if (!typeDescriptor.elementType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); + return new Set(); + } + var resultSet = new Set(); + sourceObject.forEach(function (element, i) { + try { + resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); + } + catch (e) { + // Faulty entries are skipped, because a Set is not ordered, and skipping an entry + // does not affect others. + deserializer.getErrorHandler()(e); + } + }); + return resultSet; +} +function isExpectedMapShape(source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === "object"); +} +function deserializer_convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + var expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!isExpectedMapShape(sourceObject, expectedShape)) { + var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); + return new Map(); + } + if (!typeDescriptor.keyType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); + return new Map(); + } + if (!typeDescriptor.valueType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); + return new Map(); + } + var resultMap = new Map(); + if (expectedShape === 1 /* OBJECT */) { + Object.keys(sourceObject).forEach(function (key) { + try { + var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + if (isValueDefined(resultKey)) { + resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + else { + sourceObject.forEach(function (element) { + try { + var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) { + resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + return resultMap; +} +function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). + // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime + if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) { + return new Date(sourceObject); + } + else if (sourceObject instanceof Date) { + return sourceObject; + } + else { + throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug(sourceObject), memberName); + } +} +function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== "string") { + throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug(sourceObject), memberName); + } + return createArrayBufferFromString(sourceObject); +} +function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== "string") { + throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug(sourceObject), memberName); + } + return new DataView(createArrayBufferFromString(sourceObject)); +} +function createArrayBufferFromString(input) { + var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char + var bufView = new Uint16Array(buf); + for (var i = 0, strLen = input.length; i < strLen; i++) { + bufView[i] = input.charCodeAt(i); + } + return buf; +} +function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + return new constructor(sourceObject); + } + return throwTypeMismatchError(constructor.name, "a numeric source array", srcTypeNameForDebug(sourceObject), memberName); +} +function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + return new constructor(sourceObject.map(function (value) { return ~~value; })); + } + return throwTypeMismatchError(typeDescriptor.ctor.name, "a numeric source array", srcTypeNameForDebug(sourceObject), memberName); +} // CONCATENATED MODULE: ./src/typedjson/json-array-member.ts @@ -1286,6 +1293,7 @@ var parser_assign = (undefined && undefined.__assign) || function () { + var parser_TypedJSON = /** @class */ (function () { /** * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object @@ -1433,15 +1441,15 @@ var parser_TypedJSON = /** @class */ (function () { TypedJSON.prototype.parseAsArray = function (object, dimensions) { if (dimensions === void 0) { dimensions = 1; } var json = parseToJSObject(object, Array); - return this.deserializer.convertAsArray(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); + return this.deserializer.convertSingleValue(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); }; TypedJSON.prototype.parseAsSet = function (object) { var json = parseToJSObject(object, Set); - return this.deserializer.convertAsSet(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); + return this.deserializer.convertSingleValue(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); }; TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { var json = parseToJSObject(object, Map); - return this.deserializer.convertAsMap(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); + return this.deserializer.convertSingleValue(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); }; /** * Converts an instance of the specified class type to a plain JSON object. @@ -1459,7 +1467,7 @@ var parser_TypedJSON = /** @class */ (function () { TypedJSON.prototype.toPlainArray = function (object, dimensions) { if (dimensions === void 0) { dimensions = 1; } try { - return this.serializer.convertAsArray(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); + return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); } catch (e) { this.errorHandler(e); @@ -1467,7 +1475,7 @@ var parser_TypedJSON = /** @class */ (function () { }; TypedJSON.prototype.toPlainSet = function (object) { try { - return this.serializer.convertAsSet(object, SetT(this.rootConstructor)); + return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); } catch (e) { this.errorHandler(e); @@ -1475,7 +1483,7 @@ var parser_TypedJSON = /** @class */ (function () { }; TypedJSON.prototype.toPlainMap = function (object, keyConstructor) { try { - return this.serializer.convertAsMap(object, MapT(keyConstructor, this.rootConstructor)); + return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); } catch (e) { this.errorHandler(e); @@ -1517,7 +1525,6 @@ var parser_TypedJSON = /** @class */ (function () { // CONCATENATED MODULE: ./src/typedjson/json-object.ts - function jsonObject(optionsOrTarget) { var options; if (typeof optionsOrTarget === "function") { @@ -1529,37 +1536,18 @@ function jsonObject(optionsOrTarget) { options = optionsOrTarget || {}; } function decorator(target) { - var objectMetadata; // Create or obtain JsonObjectMetadata object. - if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY)) { - // Target has no JsonObjectMetadata associated with it yet, create it now. - objectMetadata = new metadata_JsonObjectMetadata(target); - // Inherit json members and known types from parent @jsonObject (if any). - var parentMetadata = target.prototype[METADATA_FIELD_KEY]; - if (parentMetadata) { - parentMetadata.dataMembers - .forEach(function (memberMetadata, propKey) { - return objectMetadata.dataMembers.set(propKey, memberMetadata); - }); - parentMetadata.knownTypes - .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); - } - Object.defineProperty(target.prototype, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata - }); - } - else { - // Target already has JsonObjectMetadata associated with it. - objectMetadata = target.prototype[METADATA_FIELD_KEY]; - objectMetadata.classType = target; - } + var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(target.prototype); // Fill JsonObjectMetadata. objectMetadata.isExplicitlyMarked = true; objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; + if (options.typeResolver) { + objectMetadata.typeResolver = options.typeResolver; + } + if (options.typeHintEmitter) { + objectMetadata.typeHintEmitter = options.typeHintEmitter; + } // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer; if (options.name) { @@ -1569,11 +1557,7 @@ function jsonObject(optionsOrTarget) { if (optionsBase) { objectMetadata.options = optionsBase; } - // Obtain known-types. - if (typeof options.knownTypes === "string") { - objectMetadata.knownTypeMethodName = options.knownTypes; - } - else if (options.knownTypes instanceof Array) { + if (options.knownTypes) { options.knownTypes .filter(function (knownType) { return !!knownType; }) .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); @@ -1588,21 +1572,24 @@ function jsonObject(optionsOrTarget) { return decorator; } } +function isSubClass(target) { + return; +} // CONCATENATED MODULE: ./src/typedjson/json-member.ts -function jsonMember(optionsOrTarget, propKey) { - if (optionsOrTarget instanceof Object && (typeof propKey === "string" || typeof propKey === "symbol")) { - var target = optionsOrTarget; +function jsonMember(optionsOrPrototype, propKey) { + if (propKey && (typeof propKey === "string" || typeof propKey === "symbol")) { + var prototype = optionsOrPrototype; // For error messages. - var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(propKey); + var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); // jsonMember used directly, no additional information directly available besides target and propKey. // Obtain property constructor through ReflectDecorators. if (isReflectMetadataSupported) { - var reflectPropCtor = Reflect.getMetadata("design:type", target, propKey); + var reflectPropCtor = Reflect.getMetadata("design:type", prototype, propKey); if (!reflectPropCtor) { logError(decoratorName + ": could not resolve detected property constructor at runtime. " + MISSING_REFLECT_CONF_MSG); return; @@ -1611,7 +1598,7 @@ function jsonMember(optionsOrTarget, propKey) { if (isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } - injectMetadataInformation(target, propKey, { + injectMetadataInformation(prototype, propKey, { type: typeDescriptor, key: propKey.toString(), name: propKey.toString(), @@ -1625,7 +1612,7 @@ function jsonMember(optionsOrTarget, propKey) { else { // jsonMember used as a decorator factory. return function (target, _propKey) { - var options = optionsOrTarget || {}; + var options = optionsOrPrototype || {}; var typeDescriptor; var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); // For error messages. if (options.hasOwnProperty("constructor")) { @@ -1792,6 +1779,9 @@ function toJsonDecorator(target, options) { // CONCATENATED MODULE: ./src/typedjson.ts /* concated harmony reexport TypedJSON */__webpack_require__.d(__webpack_exports__, "TypedJSON", function() { return parser_TypedJSON; }); +/* concated harmony reexport defaultTypeResolver */__webpack_require__.d(__webpack_exports__, "defaultTypeResolver", function() { return defaultTypeResolver; }); +/* concated harmony reexport defaultTypeEmitter */__webpack_require__.d(__webpack_exports__, "defaultTypeEmitter", function() { return defaultTypeEmitter; }); +/* concated harmony reexport JsonObjectMetadata */__webpack_require__.d(__webpack_exports__, "JsonObjectMetadata", function() { return metadata_JsonObjectMetadata; }); /* concated harmony reexport jsonObject */__webpack_require__.d(__webpack_exports__, "jsonObject", function() { return jsonObject; }); /* concated harmony reexport jsonMember */__webpack_require__.d(__webpack_exports__, "jsonMember", function() { return jsonMember; }); /* concated harmony reexport jsonArrayMember */__webpack_require__.d(__webpack_exports__, "jsonArrayMember", function() { return jsonArrayMember; }); @@ -1811,6 +1801,7 @@ function toJsonDecorator(target, options) { + /***/ }) /******/ ]); }); diff --git a/js/typedjson.js.map b/js/typedjson.js.map index ba487f7..1ab3cb8 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\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 type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n if (isDirectlySerializableNativeType(typeDescriptor.ctor))\n {\n return sourceObject;\n }\n else if (typeDescriptor.ctor === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeDescriptor.ctor === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (isTypeTypedArray(typeDescriptor.ctor))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName?: string,\n memberOptions?: OptionsBase,\n ) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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, typeDescriptor.ctor, 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 memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n typeDescriptor: ArrayTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n typeDescriptor: SetTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n typeDescriptor: MapTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): IndexedObject|Array<{ key: any, value: any }> {\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, typeDescriptor.keyType, memberName, memberOptions),\n value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n objectName = \"object\",\n memberOptions?: OptionsBase,\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 = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = 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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor))\n {\n if (sourceObject.constructor === typeDescriptor.ctor)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName));\n }\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array))\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n typeDescriptor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedTypeIsConcrete && (\n typeDescriptor.ctor === Uint8Array\n || typeDescriptor.ctor === Uint8ClampedArray\n || typeDescriptor.ctor === Uint16Array\n || typeDescriptor.ctor === Uint32Array\n )\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n typeDescriptor.ctor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape))\n {\n return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n else\n {\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeDescriptor: ArrayTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n return sourceObject.map(element => {\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(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\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(\n sourceObject: any,\n typeDescriptor: SetTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\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 const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(this.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeDescriptor: MapTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!this.isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)));\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = this.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n this.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = this.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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\n return resultMap;\n }\n\n private _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 rootConstructor 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertAsArray(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertAsSet(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertAsMap(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertAsArray(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, MapT(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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: typeDescriptor,\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 typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;QCVA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;;;;;;AC3EO,IAAM,wBAAwB,GAAG,2DAA2D;IAC/F,qDAAqD,CAAC;AAE1D;;;;GAIG;AACI,SAAS,gCAAgC,CAAC,IAAc;IAE3D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAW,CAAC,CAAC,CAAC;AACrE,CAAC;AAEM,SAAS,kCAAkC,CAAC,IAAc;IAE7D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAW,CAAC,CAAC,CAAC;AAC/D,CAAC;AAEM,SAAS,gBAAgB,CAAC,IAAc;IAE3C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC;SAC9H,OAAO,CAAC,IAAW,CAAC,CAAC,CAAC;AAC/B,CAAC;AAEM,SAAS,QAAQ,CAAC,KAAU;IAE/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,YAAsB;IAClE,IAAM,+BAA+B,GAAG,YAAY,KAAK,MAAM;WACxD,YAAY,KAAK,WAAW;WAC5B,YAAY,KAAK,QAAQ,CAAC;IAEjC,IAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IACjG,IAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,OAAO,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC;AACpH,CAAC;AAEM,SAAS,eAAe,CAAI,IAAS,EAAE,YAA6B;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,EACzE;QACE,OAAO,IAAI,CAAC;KACb;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACI,SAAS,WAAW,CAAC,CAAW,EAAE,CAAW;IAEhD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC;AAC/C,CAAC;AAEM,SAAS,QAAQ,CAAC,OAAa;IAAE,wBAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,uCAAwB;;IAE5D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EACtE;QACI,OAAO,CAAC,KAAK,OAAb,OAAO,kBAAO,OAAO,GAAK,cAAc,GAAE;KAC7C;SACI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EACzE;QACI,OAAO,CAAC,GAAG,OAAX,OAAO,kBAAK,YAAU,OAAS,GAAK,cAAc,GAAE;KACvD;AACL,CAAC;AAEM,SAAS,UAAU,CAAC,OAAa;IAAE,wBAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,uCAAwB;;IAE9D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EACpE;QACI,OAAO,CAAC,GAAG,OAAX,OAAO,kBAAK,OAAO,GAAK,cAAc,GAAE;KAC3C;AACL,CAAC;AAEM,SAAS,UAAU,CAAC,OAAa;IAAE,wBAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,uCAAwB;;IAE9D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EACrE;QACI,OAAO,CAAC,IAAI,OAAZ,OAAO,kBAAM,OAAO,GAAK,cAAc,GAAE;KAC5C;SACI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EACzE;QACI,OAAO,CAAC,GAAG,OAAX,OAAO,kBAAK,cAAY,OAAS,GAAK,cAAc,GAAE;KACzD;AACL,CAAC;AAED;;;GAGG;AACI,SAAS,cAAc,CAAI,KAAQ;IAEtC,OAAO,CAAC,CAAC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;AAC7D,CAAC;AAEM,SAAS,YAAY,CAAI,KAAU,EAAE,WAAqB;IAE7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAC7B;QACI,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;KACnC;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAClC;QACI,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;KACnC;SACI,IAAI,OAAO,KAAK,KAAK,SAAS,EACnC;QACI,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;KACpC;SACI,IAAI,QAAQ,CAAC,KAAK,CAAC,EACxB;QACI,OAAO,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC;KACzC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAEM,IAAM,0BAA0B,GACnC,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC;AAE/E;;;GAGG;AACI,SAAS,MAAM,CAAC,EAAgC;IAEnD,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAC/B;QACI,OAAO,EAAE,CAAC,IAAI,CAAC;KAClB;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAEM,SAAS,QAAQ,CAAI,GAAM;IAC9B,OAAO,GAAG,CAAC;AACf,CAAC;;;AClJgG;AAK1F,IAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAqC/E;IA6FI,YAAY;IAEZ,4BACI,SAAmB;QAKhB,gBAAW,GAAG,IAAI,GAAG,EAA8B,CAAC;QAE3D,8DAA8D;QACvD,eAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;QASjD;;;WAGG;QACI,uBAAkB,GAAY,KAAK,CAAC;QAE3C;;;WAGG;QACI,+BAA0B,GAAY,KAAK,CAAC;QAzB/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAjGD,gBAAgB;IAChB;;;OAGG;IACW,oCAAiB,GAA/B,UAAgC,IAAc;QAE1C,IAAM,QAAQ,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACW,qCAAkB,GAAhC,UAAoC,IAAqB;QAErD,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,EACd;YACI,OAAO;SACV;QAED,IAAI,QAAsC,CAAC;QAC3C,IAAI,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAChD;YACI,uDAAuD;YACvD,QAAQ,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;SAC5C;QAED,0DAA0D;QAC1D,IAAI,QAAQ,IAAI,QAAQ,CAAC,kBAAkB,EAC3C;YACI,OAAO,QAAQ,CAAC;SACnB;QAED,gEAAgE;QAChE,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,IAAI,CAAC,EACxD;YACI,IAAM,aAAa,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACnD,aAAa,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACxC,oEAAoE;YACpE,OAAO,aAAa,CAAC;SACxB;IACL,CAAC;IAEa,2CAAwB,GAAtC,UAAuC,SAAwB;QAE3D,IAAI,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;YAC9C,OAAO,SAAS,CAAC,kBAAkB,CAAC,CAAC;SACxC;QACG,0EAA0E;QAC9E,IAAM,cAAc,GAAG,IAAI,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAErE,yEAAyE;QACzE,IAAM,cAAc,GAAuB,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACzE,IAAI,cAAc,EAClB;YACI,cAAc,CAAC,WAAW;iBACrB,OAAO,CAAC,UAAC,cAAc,EAAE,OAAO;gBAC7B,qBAAc,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC;YAAvD,CAAuD,CAAC,CAAC;YACjE,cAAc,CAAC,UAAU;iBACpB,OAAO,CAAC,UAAC,SAAS,IAAK,qBAAc,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAxC,CAAwC,CAAC,CAAC;YACtE,cAAc,CAAC,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;YAC1D,cAAc,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC;SACnE;QAED,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,kBAAkB,EAAE;YACjD,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,cAAc;SACxB,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACW,2CAAwB,GAAtC,UAAuC,WAAqB;QAExD,IAAM,QAAQ,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACpE,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvE,CAAC;IAEc,8CAA2B,GAA1C,UAA2C,IAAc;QAErD,OAAO,gCAAgC,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC;eAChE,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,CAAC;IACrD,CAAC;IA2CL,yBAAC;AAAD,CAAC;;AAEM,SAAS,yBAAyB,CAAC,SAAwB,EAAE,OAAwB,EAAE,QAA4B;IAEtH,IAAM,aAAa,GAAG,oBAAkB,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,OAAO,CAAG,CAAC,CAAC,sBAAsB;IAElH,oGAAoG;IACpG,4GAA4G;IAC5G,2DAA2D;IAC3D,IAAI,OAAO,SAAS,KAAK,UAAU,EACnC;QACI,QAAQ,CAAI,aAAa,oCAAiC,CAAC,CAAC;QAC5D,OAAO;KACV;IAED,gCAAgC;IAChC,oDAAoD;IACpD,IAAI,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,UAAU,EAC5C;QACI,QAAQ,CAAI,aAAa,oCAAiC,CAAC,CAAC;QAC5D,OAAO;KACV;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC3D;QACI,QAAQ,CAAI,aAAa,2CAAwC,CAAC,CAAC;QACnE,OAAO;KACV;IAED,+FAA+F;IAC/F,2HAA2H;IAC3H,IAAM,cAAc,GAAG,2BAAkB,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAE9E,IAAI,CAAC,QAAQ,CAAC,YAAY,EAC1B;QACI,gDAAgD;QAChD,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,cAAI,IAAI,qBAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAnC,CAAmC,CAAC,CAAC;KACjF;IAED,wDAAwD;IACvD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAgC;SAChD,OAAO,CAAC,UAAC,GAAG,IAAK,QAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,EAArD,CAAqD,CAAC,CAAC;IAC7E,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;;;AC9MD,IAAM,WAAW,GAA0B;IACvC,cAAc;CACjB,CAAC;AAEK,SAAS,iBAAiB,CAAC,IAAwC;IACtE,IAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5B,MAAM,CAAC,aAAG,IAAI,OAAC,WAAwB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAA3C,CAA2C,CAAC;SAC1D,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG;QACb,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAS,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAEM,SAAS,kBAAkB,CAA8B,GAAM;IAClE,QAAQ,GAAG,EAAE;QACT,KAAK,cAAc;YACf,OAAO,KAAK,CAAC;KACpB;IACD,gBAAgB;IAChB,OAAO,IAAW,CAAC;AACvB,CAAC;AAEM,SAAS,cAAc,CAC1B,GAAM,EACN,OAAqB;IAErB,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;QAAE,OAAO,OAAO,CAAC,GAAG,CAAE,CAAC;IAC1D,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAEM,SAAS,YAAY,CACxB,QAAsB,EACtB,YAA0B;IAE1B,OAAO,CAAC,YAAY;QAChB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,EAAE,EACF,QAAQ,EACR,YAAY,CACf,CAAC;AACV,CAAC;;;;;;;;;;;;;;;;ACxDD;IACI,wBAAsC,IAAc;QAAd,SAAI,GAAJ,IAAI,CAAU;IAAG,CAAC;IAExD,iCAAQ,GAAR;QACI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACL,qBAAC;AAAD,CAAC;;AAID;IAA4C,0CAAc;IACtD,gCAAY,IAAc;eACtB,kBAAM,IAAI,CAAC;IACf,CAAC;IACL,6BAAC;AAAD,CAAC,CAJ2C,cAAc,GAIzD;;AAED;IAAoD,yCAAc;IAC9D,+BAAsB,IAAc;eAChC,kBAAM,IAAI,CAAC;IACf,CAAC;IACL,4BAAC;AAAD,CAAC,CAJmD,cAAc,GAIjE;;AAED;IAAyC,uCAAqB;IAC1D,6BAA4B,WAA2B;QAAvD,YACI,kBAAM,KAAK,CAAC,SACf;QAF2B,iBAAW,GAAX,WAAW,CAAgB;;IAEvD,CAAC;IAED,sCAAQ,GAAR;QACI,OAAO,iBAAM,QAAQ,WAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IACL,0BAAC;AAAD,CAAC,CARwC,qBAAqB,GAQ7D;;AAEM,SAAS,MAAM,CAAC,WAAqB;IACxC,OAAO,IAAI,mBAAmB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;IAAuC,qCAAqB;IACxD,2BAA4B,WAA2B;QAAvD,YACI,kBAAM,GAAG,CAAC,SACb;QAF2B,iBAAW,GAAX,WAAW,CAAgB;;IAEvD,CAAC;IAED,oCAAQ,GAAR;QACI,OAAO,iBAAM,QAAQ,WAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IACL,wBAAC;AAAD,CAAC,CARsC,qBAAqB,GAQ3D;;AAEM,SAAS,IAAI,CAAC,WAAqB;IACtC,OAAO,IAAI,iBAAiB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;AACpE,CAAC;AAqBD;IAAuC,qCAAqB;IACxD,2BACoB,OAAuB,EACvB,SAAyB,EACzB,OAA6B;QAHjD,YAKI,kBAAM,GAAG,CAAC,SACb;QALmB,aAAO,GAAP,OAAO,CAAgB;QACvB,eAAS,GAAT,SAAS,CAAgB;QACzB,aAAO,GAAP,OAAO,CAAsB;;IAGjD,CAAC;IAED,oCAAQ,GAAR;QACI,OAAO,iBAAM,QAAQ,WAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,8CAAkB,GAAlB;;QACI,OAAO;YACH,KAAK,EAAE,WAAI,CAAC,OAAO,0CAAE,KAAK,EAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,cAAe;SACnE,CAAC;IACN,CAAC;IACL,wBAAC;AAAD,CAAC,CAlBsC,qBAAqB,GAkB3D;;AAEM,SAAS,IAAI,CAAC,OAAiB,EAAE,SAAmB,EAAE,OAA6B;IACtF,OAAO,IAAI,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1G,CAAC;AAED,oEAAoE;AACpE,wEAAwE;AACxE,iEAAiE;AACjE,yBAAyB;AACzB,QAAQ;AACR,EAAE;AACF,+BAA+B;AAC/B,uEAAuE;AACvE,QAAQ;AACR,IAAI;AACJ,EAAE;AACF,2EAA2E;AAC3E,8EAA8E;AAC9E,IAAI;AAEG,SAAS,UAAU,CAAC,IAAS;IAChC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,YAAY,cAAc,CAAC,CAAC;AAClF,CAAC;AAEM,SAAS,oBAAoB,CAAC,IAAc;IAC/C,OAAO,IAAI,YAAY,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;;;;;;;;;;;;;;AC5GkB;AAE8C;AACU;AAQhD;AAEpB,SAAS,kBAAkB,CAC9B,YAA2B,EAC3B,YAA2B,EAC3B,kBAA4B,EAC5B,kBAAuC;IAEvC,8FAA8F;IAC9F,8FAA8F;IAC9F,iGAAiG;IACjG,IAAI,YAAY,CAAC,WAAW,KAAK,kBAAkB,EACnD;QACI,YAAY,CAAC,MAAM,GAAG,kBAAkB,IAAI,kBAAkB,CAAC,IAAI;YAC/D,CAAC,CAAC,kBAAkB,CAAC,IAAI;YACzB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;KAC1C;AACL,CAAC;AAiBD;;;;;;;;;GASG;AACH;IAAA;QAGY,oBAAe,GAAoB,kBAAkB,CAAC;QACtD,iBAAY,GAA2B,QAAQ,CAAC;QAChD,0BAAqB,GAAG,IAAI,GAAG,CAA4D;YAC/F,aAAa;YACb,CAAC,IAAI,EAAE,QAAQ,CAAC;YAChB,CAAC,MAAM,EAAE,QAAQ,CAAC;YAClB,CAAC,MAAM,EAAE,QAAQ,CAAC;YAClB,CAAC,OAAO,EAAE,QAAQ,CAAC;YAEnB,CAAC,WAAW,EAAE,oBAAoB,CAAC;YACnC,CAAC,QAAQ,EAAE,iBAAiB,CAAC;YAE7B,CAAC,KAAK,EAAE,cAAc,CAAC;YACvB,CAAC,GAAG,EAAE,YAAY,CAAC;YACnB,CAAC,GAAG,EAAE,YAAY,CAAC;YAEnB,eAAe;YACf,CAAC,YAAY,EAAG,mBAAmB,CAAC;YACpC,CAAC,YAAY,EAAG,mBAAmB,CAAC;YACpC,CAAC,SAAS,EAAG,mBAAmB,CAAC;YACjC,CAAC,UAAU,EAAG,mBAAmB,CAAC;YAClC,CAAC,iBAAiB,EAAG,mBAAmB,CAAC;YACzC,CAAC,UAAU,EAAG,mBAAmB,CAAC;YAClC,CAAC,WAAW,EAAG,mBAAmB,CAAC;YACnC,CAAC,UAAU,EAAG,mBAAmB,CAAC;YAClC,CAAC,WAAW,EAAE,mBAAmB,CAAC;SACrC,CAAC,CAAC;IA0EP,CAAC;IAxEU,uCAAkB,GAAzB,UAA0B,mBAAoC;QAE1D,IAAI,OAAO,mBAAmB,KAAK,UAAU,EAC7C;YACI,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;SACnE;QAED,IAAI,CAAC,eAAe,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAEM,uCAAkB,GAAzB;QAEI,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAEM,oCAAe,GAAtB,UAAuB,oBAA4C;QAE/D,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAC9C;YACI,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;SACpE;QAED,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAC7C,CAAC;IAEM,oCAAe,GAAtB;QAEI,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,yCAAoB,GAA3B,UAA4B,aAA2B;QAEnD,OAAO,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACI,uCAAkB,GAAzB,UACI,YAAiB,EACjB,cAA8B,EAC9B,UAA6B,EAC7B,aAA2B;QAD3B,kDAA6B;QAG7B,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACnF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;YAAE,OAAO;QAE1C,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,EACpD;YACI,IAAI,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAElD,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAC3B,0BAAwB,UAAU,qBAAgB,YAAY,gBAAW,UAAU,OAAI,CAAC,CAC3F,CAAC;YACF,OAAO;SACV;QAED,IAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,UAAU,EAAE;YACZ,OAAO,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;SACpF;QACD,uEAAuE;QACvE,IAAI,OAAO,YAAY,KAAK,QAAQ,EACpC;YACI,OAAO,eAAe,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;SACzF;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAC3B,0BAAwB,UAAU,+CAA4C,CAAC,CAClF,CAAC;IACN,CAAC;IACL,iBAAC;AAAD,CAAC;;AAED;;;GAGG;AACH,SAAS,eAAe,CACpB,YAA2B,EAC3B,cAAsC,EACtC,UAAkB,EAClB,UAAsB,EACtB,aAA2B;IAE3B,IAAI,kBAAgD,CAAC;IACrD,IAAI,YAA2B,CAAC;IAChC,IAAI,eAAe,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAC;IAEtD,IAAI,YAAY,CAAC,WAAW,KAAK,cAAc,CAAC,IAAI,IAAI,YAAY,YAAY,cAAc,CAAC,IAAI,EACnG;QACI,4EAA4E;QAC5E,oFAAoF;QACpF,kBAAkB,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;KACxF;SAED;QACI,kBAAkB,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;KACnF;IAED,IAAI,kBAAkB,EACtB;QAEI,IAAI,kBAAkB,CAAC,6BAA6B,EAAE;YAClD,yBAAyB;YACzB,IAAI,OAAQ,YAAoB,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,KAAK,UAAU,EACjG;gBACK,YAAoB,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,EAAE,CAAC;aAC7E;YACD,mBAAmB;iBACd,IAAI,OAAQ,YAAY,CAAC,WAAmB,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,KAAK,UAAU,EAClH;gBACK,YAAY,CAAC,WAAmB,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,EAAE,CAAC;aACzF;iBAED;gBACI,UAAU,CAAC,eAAe,EAAE,CAAC,IAAI,SAAS,CACtC,mCAAiC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAI,kBAAkB,CAAC,6BAA6B,uBAAoB,CAChJ,CAAC,CAAC;aACN;SACJ;QAED,IAAM,YAAU,GAAG,kBAAkB,CAAC;QACtC,wCAAwC;QACxC,uGAAuG;QACvG,yGAAyG;QACzG,2DAA2D;QAC3D,YAAY,GAAG,EAAE,CAAC;QAElB,IAAM,cAAY,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,YAAU,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,YAAU,CAAC,eAAe,EAC9B;YACI,eAAe,GAAG,YAAU,CAAC,eAAe,CAAC;SAChD;QAED,YAAU,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,iBAAiB;YAE7C,IAAM,gBAAgB,GAAG,YAAY,CAAC,cAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC/E,IAAI,UAAU,CAAC;YACf,IAAI,iBAAiB,CAAC,UAAU,EAAE;gBAC9B,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;aAClF;iBAAM,IAAI,iBAAiB,CAAC,IAAI,EAAE;gBAC/B,UAAU,GAAG,UAAU,CAAC,kBAAkB,CACtC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,EACnC,iBAAiB,CAAC,IAAI,EACnB,MAAM,CAAC,YAAU,CAAC,SAAS,CAAC,SAAI,iBAAiB,CAAC,GAAK,EAC1D,gBAAgB,CACnB,CAAC;aACL;iBAAM;gBACH,MAAM,IAAI,SAAS,CACf,yBAAuB,iBAAiB,CAAC,IAAI,eAAY;sBACvD,oDAAoD,CACzD,CAAC;aACL;YAED,IAAI,cAAc,CAAC,UAAU,CAAC;mBACvB,CAAC,UAAU,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,UAAU,KAAK,IAAI,CAAC,EAC/E;gBACE,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;aACrD;QACL,CAAC,CAAC,CAAC;KACN;SAED;QACI,iEAAiE;QACjE,gHAAgH;QAChH,0BAA0B;QAC1B,YAAY,gBAAQ,YAAY,CAAE,CAAC;KACtC;IAED,iBAAiB;IACjB,eAAe,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAErF,OAAO,YAAY,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACnB,YAAmB,EACnB,cAA8B,EAC9B,UAAiB,EACjB,UAAsB,EACtB,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,mBAAmB,CAAC,EACpD;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,6DAA0D;cACzG,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAI,CAAC,cAAc,CAAC,WAAW,EAC/B;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,gDAA6C,CAAC,CAAC;KACvG;IAED,gDAAgD;IAChD,4FAA4F;IAC5F,+FAA+F;IAC/F,8FAA8F;IAC9F,qBAAqB;IACrB,YAAY,CAAC,OAAO,CAAC,UAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC;eAClE,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,EAC5D;YACE,IAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACjE,IAAM,cAAc,GAAG,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,SAAI,CAAC,OAAI;iBAC1D,gBAAc,gBAAgB,gBAAW,cAAc,OAAI,EAAC,CAAC;SACpE;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,EACd;QACI,+BAA+B;QAC/B,UAAU,IAAI,IAAI,CAAC;KACtB;IAED,OAAO,YAAY,CAAC,GAAG,CACnB,iBAAO,IAAI,iBAAU,CAAC,kBAAkB,CACpC,OAAO,EAAE,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CACjE,EAFU,CAEV,CACJ,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACjB,YAAsB,EACtB,cAA8B,EAC9B,UAAkB,EAClB,UAAsB,EACtB,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAClD;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,2DAAwD;cACvG,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAI,CAAC,cAAc,CAAC,WAAW,EAC/B;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,8CAA2C,CAAC,CAAC;KACrG;IAED,oCAAoC;IACpC,IAAI,UAAU,EACd;QACI,UAAU,IAAI,IAAI,CAAC;KACtB;IAED,IAAI,WAAW,GAAU,EAAE,CAAC;IAE5B,oEAAoE;IACpE,gGAAgG;IAChG,+BAA+B;IAC/B,YAAY,CAAC,OAAO,CAAC,iBAAO;QAExB,IAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAEpH,0FAA0F;QAC1F,+FAA+F;QAC/F,wDAAwD;QACxD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,aAAa,CAAC,EAC7D;YACI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACnC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACjB,YAA2B,EAC3B,cAA8B,EAC9B,UAAkB,EAClB,UAAsB,EACtB,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAClD;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,2DAAwD;cACvG,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAI,CAAC,cAAc,CAAC,SAAS,EAC7B;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,4CAAyC,CAAC,CAAC;KACnG;IAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAC3B;QACI,MAAM,IAAI,SAAS,CAAC,yBAAuB,UAAU,0CAAuC,CAAC,CAAC;KACjG;IAED,IAAI,UAAU,EACd;QACI,UAAU,IAAI,IAAI,CAAC;KACtB;IAED,2DAA2D;IAC3D,IAAM,WAAW,GAAG,cAAc,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC;IAC9D,IAAM,MAAM,GAAG,WAAW,mBAAoB,CAAC,CAAC,CAAE,EAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAM,YAAY,GAAG,UAAU,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAEpE,+FAA+F;IAC/F,YAAY,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;QAE5B,IAAI,qBAAqB,GAAG;YACxB,GAAG,EAAE,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;YAC1F,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;SACnG,CAAC;QAEF,4EAA4E;QAC5E,IAAM,UAAU,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC;eACzD,CAAC,qBAAqB,CAAC,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,CAAC;QAC9D,IAAI,UAAU,IAAI,YAAY,EAC9B;YACI,IAAI,WAAW,mBAAoB,EAAE;gBACjC,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC;aACnE;iBAAM;gBACH,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;aACtC;SACJ;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,YAA6B;IAEtD,OAAO,KAAK,CAAC,IAAI,CAAC,YAAmB,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAmB;IAE7C,6EAA6E;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAQ,IAAI,aAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAA7B,CAA6B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvG,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAAkB;IAEzC,OAAO,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;;;ACvcyE;AAEZ;AACa;AAQhD;AAEpB,SAAS,mBAAmB,CAC/B,YAA2B,EAAE,UAAiC;IAE9D,IAAI,YAAY,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAWD;;;GAGG;AACH;IAAA;QAIY,iBAAY,GAAiB,mBAAmB,CAAC;QAEjD,iBAAY,GAA2B,QAAQ,CAAC;QAChD,4BAAuB,GAAG,IAAI,GAAG,CAA8D;YACnG,aAAa;YACb,CAAC,MAAM,EAAE,mBAAmB,CAAC;YAC7B,CAAC,MAAM,EAAE,mBAAmB,CAAC;YAC7B,CAAC,OAAO,EAAE,mBAAmB,CAAC;YAE9B,CAAC,IAAI,EAAE,eAAe,CAAC;YACvB,CAAC,WAAW,EAAE,mBAAmB,CAAC;YAClC,CAAC,QAAQ,EAAE,gBAAgB,CAAC;YAE5B,CAAC,KAAK,EAAE,2BAAc,CAAC;YACvB,CAAC,GAAG,EAAE,yBAAY,CAAC;YACnB,CAAC,GAAG,EAAE,yBAAY,CAAC;YAEnB,eAAe;YACf,CAAC,YAAY,EAAG,mBAAmB,CAAC;YACpC,CAAC,YAAY,EAAG,mBAAmB,CAAC;YACpC,CAAC,UAAU,EAAG,kBAAkB,CAAC;YACjC,CAAC,iBAAiB,EAAG,kBAAkB,CAAC;YACxC,CAAC,WAAW,EAAG,kBAAkB,CAAC;YAClC,CAAC,WAAW,EAAE,kBAAkB,CAAC;SACpC,CAAC,CAAC;IA+HP,CAAC;IA7HU,sCAAe,GAAtB,UAAuB,oBAAgD;QAEnE,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAC7C,CAAC;IAEM,sCAAe,GAAtB,UAAuB,oBAAkC;QAErD,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAC9C;YACI,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;SACpE;QAED,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAC7C,CAAC;IAEM,sCAAe,GAAtB;QAEI,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,sCAAe,GAAtB,UAAuB,oBAA4C;QAE/D,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAC9C;YACI,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;SACpE;QAED,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAC7C,CAAC;IAEM,sCAAe,GAAtB;QAEI,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,yCAAkB,GAAzB,UACI,YAAiB,EACjB,cAA8B,EAC9B,UAAiC,EACjC,UAAqB,EACrB,aAA2B;QAD3B,kDAAqB;QAGrB,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,IAAI,YAAY,KAAK,IAAI,EACrE;YACI,OAAO,IAAI,CAAC;SACf;aACI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EACtC;YACI,OAAO;SACV;QAED,IAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,YAAY,EAChB;YACI,OAAO,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;SAClG;QAED,IAAI,OAAO,YAAY,KAAK,QAAQ,EACpC;YACI,OAAO,4BAAe,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;SACtF;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAC3B,4BAA0B,UAAU,iDAA8C,CAAC,CACtF,CAAC;IACN,CAAC;IAEM,sCAAe,GAAtB,UAAuB,IAAS;QAE5B,OAAO,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC;IAEM,sCAAe,GAAtB;QAAA,iBAoBC;QApBsB,uBAA8C;aAA9C,UAA8C,EAA9C,qBAA8C,EAA9C,IAA8C;YAA9C,kCAA8C;;QAEjE,IAAI,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAEzC,aAAa,CAAC,OAAO,CAAC,oBAAU;YAE5B,UAAU,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,IAAI;gBAE1B,IAAI,KAAI,CAAC,YAAY,EACrB;oBACI,MAAM,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;iBAC7C;qBAED;oBACI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC1B;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,0CAAmB,GAA1B,UAA2B,SAAwB;QAAnD,iBAqBC;QAnBG,IAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;QAExC,SAAS,CAAC,OAAO,CAAC,cAAI;YAElB,IAAI,KAAI,CAAC,YAAY,EACrB;gBACI,GAAG,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;aAC1C;iBAED;gBACI,IAAM,aAAa,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAClE,IAAM,MAAI,GAAG,aAAa,IAAI,aAAa,CAAC,kBAAkB,IAAI,aAAa,CAAC,IAAI;oBAChF,CAAC,CAAC,aAAa,CAAC,IAAI;oBACpB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChB,GAAG,CAAC,GAAG,CAAC,MAAI,EAAE,IAAI,CAAC,CAAC;aACvB;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,yCAAkB,GAA1B,UAA2B,MAAW,EAAE,aAAuB;QAC3D,OAAO,CAAC,aAAa,kBAAmB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;eAC/D,CAAC,aAAa,mBAAoB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;IACzE,CAAC;IAEM,2CAAoB,GAA3B,UAA4B,aAA2B;QAEnD,OAAO,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACrF,CAAC;IACL,mBAAC;AAAD,CAAC;;AAED,SAAS,sBAAsB,CAC3B,UAAkB,EAClB,kBAA0B,EAC1B,gBAAwB,EACxB,UAAkB;IAElB,MAAM,IAAI,SAAS,CACf,2BAAyB,UAAU,YAAO,UAAU,MAAG;WACrD,eAAa,kBAAkB,cAAS,gBAAgB,MAAG,EAChE,CAAC;AACN,CAAC;AAED,SAAS,oBAAoB,CAAC,YAA+B,EAAE,UAA6B,EAAE,UAAkB;IAE5G,IAAM,gBAAgB,GAAG,CAAC,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACpG,IAAM,cAAc,GAAG,CAAC,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAE5F,OAAO,2BAAyB,UAAU,oBAAe,gBAAgB,gBAAW,cAAc,OAAI,CAAC;AAC3G,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAiB;IAC1C,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CACxB,YAAe,EACf,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,IAAI,YAAY,CAAC,WAAW,KAAK,cAAc,CAAC,IAAI,EACpD;QACI,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;KAChH;IACD,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,4BAAe,CACpB,YAA2B,EAC3B,cAAsC,EACtC,UAAiC,EACjC,UAAkB,EAClB,YAA+B;IAE/B,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAC7D;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,wBAAsB,UAAU,+CAA4C,CAAC,CAC9F,CAAC;QACF,OAAO,SAAS,CAAC;KACpB;IAED,IAAI,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC;IAC3C,IAAI,oBAAoB,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACnF,IAAI,qBAAqB,GAAG,UAAU,CAAC;IACvC,IAAI,YAAY,GAAG,YAAY,CAAC,eAAe,EAAE,CAAC;IAElD,IAAI,oBAAoB,EACxB;QACI,wFAAwF;QACxF,qBAAqB,GAAG,YAAY,CAAC,eAAe,CAChD,qBAAqB,EACrB,YAAY,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CACpE,CAAC;QACF,IAAI,oBAAoB,CAAC,YAAY,EACrC;YACI,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC;SACpD;KACJ;IAED,4DAA4D;IAC5D,IAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAE3E,IAAI,gBAAgB,EACpB;QACI,qEAAqE;QACrE,IAAI,WAAW,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EACnD;YACI,YAAY;YACZ,gBAAgB,GAAG,gBAAgB,CAAC;YACpC,oBAAoB,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;YAE/E,IAAI,oBAAoB,EACxB;gBACI,2CAA2C;gBAC3C,qBAAqB,GAAG,YAAY,CAAC,eAAe,CAChD,qBAAqB,EACrB,YAAY,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CACpE,CAAC;aACL;SACJ;KACJ;IAED,IAAI,oBAAoB,IAAI,oBAAoB,CAAC,kBAAkB,EACnE;QACI,IAAM,gBAAc,GAAG,oBAAoB,CAAC;QAC5C,qDAAqD;QACrD,wDAAwD;QACxD,IAAM,wCAAsC,GAAG,EAAmB,CAAC;QAEnE,IAAM,cAAY,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAc,CAAC,OAAO,CAAC,CAAC;QAEhF,sCAAsC;QACtC,gBAAc,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,iBAAiB,EAAE,OAAO;YAE1D,IAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAM,kBAAkB,GAAM,MAAM,CAAC,gBAAc,CAAC,SAAS,CAAC,SAAI,OAAS,CAAC;YAC5E,IAAM,gBAAgB,GAAG,YAAY,CAAC,cAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE/E,IAAI,YAAY,CAAC;YACjB,IAAI,iBAAiB,CAAC,YAAY,EAClC;gBACI,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;aACjE;iBACI,IAAI,iBAAiB,CAAC,IAAI,EAC/B;gBACI,YAAY,GAAG,YAAY,CAAC,kBAAkB,CAC1C,cAAc,EACd,iBAAiB,CAAC,IAAI,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,CACnB,CAAC;aACL;iBAED;gBACI,MAAM,IAAI,SAAS,CACf,wBAAsB,kBAAkB,cAAW;sBACjD,sDAAsD,CAC3D,CAAC;aACL;YAED,IAAI,cAAc,CAAC,YAAY,CAAC;mBACzB,CAAC,YAAY,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,YAAY,KAAK,IAAI,CAAC,EACnF;gBACE,wCAAsC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;aAChF;iBACI,IAAI,iBAAiB,CAAC,UAAU,EACrC;gBACI,YAAY,CAAC,eAAe,EAAE,CAAC,IAAI,SAAS,CAAC,8BAA4B,kBAAkB,OAAI,CAAC,CAAC,CAAC;aACrG;QACL,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,IAAI,YAAY,SAAe,CAAC;QAEhC,IAAI,OAAO,oBAAoB,CAAC,mBAAmB,KAAK,UAAU,EAClE;YACI,IACA;gBACI,YAAY,GAAG,oBAAoB,CAAC,mBAAmB,CACnD,wCAAsC,EACtC,YAAY,CACf,CAAC;gBAEF,2DAA2D;gBAC3D,IAAI,CAAC,YAAY,EACjB;oBACI,MAAM,IAAI,SAAS,CACf,wBAAsB,UAAU,MAAG;0BACjC,iDAAiD;2BACjD,YAAU,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,oBAAiB,EACtE,CAAC;iBACL;qBACI,IAAI,CAAC,CAAC,YAAY,YAAY,oBAAoB,CAAC,SAAS,CAAC,EAClE;oBACI,MAAM,IAAI,SAAS,CACf,wBAAsB,UAAU,MAAG;2BACjC,6BAA2B,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,MAAG;2BAC9D,YAAU,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,mBAAgB;2BAChE,YAAU,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,0BAAuB;2BACjE,OAAK,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAG,EACnD,CAAC;iBACL;aACJ;YACD,OAAO,CAAC,EACR;gBACI,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,OAAO,SAAS,CAAC;aACpB;SACJ;aAED;YACI,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;SACjE;QAED,4DAA4D;QAC5D,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,wCAAsC,CAAC,CAAC;QAEpE,uCAAuC;QACvC,IAAI,oBAAoB,CAAC,wBAAwB,EACjD;YACI,yBAAyB;YACzB,IAAI,OAAQ,YAAoB,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,KAAK,UAAU,EAC9F;gBACK,YAAoB,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aAC1E;YACD,mBAAmB;iBACd,IAAI,OAAQ,YAAY,CAAC,WAAmB,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,KAAK,UAAU,EAC/G;gBACK,YAAY,CAAC,WAAmB,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aACtF;iBAED;gBACI,YAAY,CAAC,eAAe,EAAE,CAAC,IAAI,SAAS,CACxC,8BAA4B,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,SAAI,oBAAoB,CAAC,wBAAwB,uBAAoB,CAC1I,CAAC,CAAC;aACN;SACJ;QAED,OAAO,YAAY,CAAC;KACvB;SAED;QACI,gDAAgD;QAChD,IAAM,cAAY,GAAG,EAAmB,CAAC;QAEzC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,mBAAS;YAEvC,cAAY,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,kBAAkB,CACrD,YAAY,CAAC,SAAS,CAAC,EACvB,IAAI,sBAAsB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,EAC/D,UAAU,EACV,SAAS,CACZ,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,OAAO,cAAY,CAAC;KACvB;AACL,CAAC;AAED,SAAS,2BAAc,CACnB,YAAiB,EACjB,cAA8B,EAC9B,UAAiC,EACjC,UAAkB,EAClB,YAA+B,EAC/B,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,mBAAmB,CAAC,EACpD;QACI,MAAM,IAAI,SAAS,CAAC,2BAAyB,UAAU,6DAA0D;cAC3G,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAClC;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CACnF,CAAC;QACF,OAAO,EAAE,CAAC;KACb;IAED,IAAI,CAAC,cAAc,CAAC,WAAW,EAC/B;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,2BAAyB,UAAU,gEAA6D,CAAC,CAClH,CAAC;QACF,OAAO,EAAE,CAAC;KACb;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,iBAAO;QAC3B,0IAA0I;QAC1I,mCAAmC;QACnC,IACA;YACI,OAAO,YAAY,CAAC,kBAAkB,CAClC,OAAO,EACP,cAAc,CAAC,WAAW,EAC1B,UAAU,EACP,UAAU,OAAI,EACjB,aAAa,CAChB,CAAC;SACL;QACD,OAAO,CAAC,EACR;YACI,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;YAElC,wEAAwE;YACxE,kFAAkF;YAClF,OAAO,SAAS,CAAC;SACpB;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,yBAAY,CACjB,YAAiB,EACjB,cAA8B,EAC9B,UAAiC,EACjC,UAAkB,EAClB,YAA+B,EAC/B,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAClD;QACI,MAAM,IAAI,SAAS,CAAC,2BAAyB,UAAU,2DAAwD;cACzG,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAClC;QACI,YAAY,CAAC,eAAe,EAAE,CAAC,IAAI,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO,IAAI,GAAG,EAAO,CAAC;KACzB;IAED,IAAI,CAAC,cAAc,CAAC,WAAW,EAC/B;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,2BAAyB,UAAU,4DAAyD,CAAC,CAC9G,CAAC;QACF,OAAO,IAAI,GAAG,EAAO,CAAC;KACzB;IAED,IAAM,SAAS,GAAG,IAAI,GAAG,EAAO,CAAC;IAEjC,YAAY,CAAC,OAAO,CAAC,UAAC,OAAO,EAAE,CAAC;QAC5B,IACA;YACI,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,kBAAkB,CACzC,OAAO,EACP,cAAc,CAAC,WAAW,EAC1B,UAAU,EACP,UAAU,SAAI,CAAC,MAAG,EACrB,aAAa,CAChB,CAAC,CAAC;SACN;QACD,OAAO,CAAC,EACR;YACI,kFAAkF;YAClF,0BAA0B;YAC1B,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;SACrC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAW,EAAE,aAAuB;IAC5D,OAAO,CAAC,aAAa,kBAAmB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;WAC3D,CAAC,aAAa,mBAAoB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,yBAAY,CACjB,YAAiB,EACjB,cAA8B,EAC9B,UAAiC,EACjC,UAAkB,EAClB,YAA+B,EAC/B,aAA2B;IAE3B,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAClD;QACI,MAAM,IAAI,SAAS,CAAC,2BAAyB,UAAU,2DAAwD;cACzG,8CAA8C,CAAC,CAAC;KACzD;IACD,IAAM,aAAa,GAAG,cAAc,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC;IAChE,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,EACpD;QACI,IAAM,YAAY,GAAG,aAAa,kBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACvE,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,oBAAoB,CAAC,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAC1F,CAAC;QACF,OAAO,IAAI,GAAG,EAAY,CAAC;KAC9B;IAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAC3B;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,2BAAyB,UAAU,sCAAmC,CAAC,CACxF,CAAC;QACF,OAAO,IAAI,GAAG,EAAY,CAAC;KAC9B;IAED,IAAI,CAAC,cAAc,CAAC,SAAS,EAC7B;QACI,YAAY,CAAC,eAAe,EAAE,CAC1B,IAAI,SAAS,CAAC,2BAAyB,UAAU,wCAAqC,CAAC,CAC1F,CAAC;QACF,OAAO,IAAI,GAAG,EAAY,CAAC;KAC9B;IAED,IAAM,SAAS,GAAG,IAAI,GAAG,EAAY,CAAC;IAEtC,IAAI,aAAa,mBAAoB,EACrC;QACI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,aAAG;YACjC,IACA;gBACI,IAAM,SAAS,GAAG,YAAY,CAAC,kBAAkB,CAC7C,GAAG,EACH,cAAc,CAAC,OAAO,EACtB,UAAU,EACV,UAAU,EACV,aAAa,CAChB,CAAC;gBACF,IAAI,cAAc,CAAC,SAAS,CAAC,EAC7B;oBACI,SAAS,CAAC,GAAG,CACT,SAAS,EACT,YAAY,CAAC,kBAAkB,CAC3B,YAAY,CAAC,GAAG,CAAC,EACjB,cAAc,CAAC,SAAS,EACxB,UAAU,EACP,UAAU,SAAI,SAAS,MAAG,EAC7B,aAAa,CAChB,CACJ,CAAC;iBACL;aACJ;YACD,OAAO,CAAC,EACR;gBACI,4DAA4D;gBAC5D,gDAAgD;gBAChD,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;aACrC;QACL,CAAC,CAAC;KACL;SAED;QACI,YAAY,CAAC,OAAO,CAAC,UAAC,OAAY;YAC9B,IACA;gBACI,IAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CACvC,OAAO,CAAC,GAAG,EACX,cAAc,CAAC,OAAO,EACtB,UAAU,EACV,UAAU,EACV,aAAa,CAChB,CAAC;gBAEF,iDAAiD;gBACjD,IAAI,cAAc,CAAC,GAAG,CAAC,EACvB;oBACI,SAAS,CAAC,GAAG,CACT,GAAG,EACH,YAAY,CAAC,kBAAkB,CAC3B,OAAO,CAAC,KAAK,EACb,cAAc,CAAC,SAAS,EACxB,UAAU,EACP,UAAU,SAAI,GAAG,MAAG,EACvB,aAAa,CAChB,CACJ,CAAC;iBACL;aACJ;YACD,OAAO,CAAC,EACR;gBACI,4DAA4D;gBAC5D,gDAAgD;gBAChD,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;aACrC;QACL,CAAC,CAAC,CAAC;KACN;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CACpB,YAAoC,EACpC,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,2GAA2G;IAC3G,sDAAsD;IAEtD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,GAAG,CAAC,CAAC,EAC9F;QACI,OAAO,IAAI,IAAI,CAAC,YAAmB,CAAC,CAAC;KACxC;SACI,IAAI,YAAY,YAAY,IAAI,EACrC;QACI,OAAO,YAAY;KACtB;SAED;QACI,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;KACvG;AACL,CAAC;AAED,SAAS,mBAAmB,CACxB,YAAoC,EACpC,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,IAAI,OAAO,YAAY,KAAK,QAAQ,EACpC;QACI,sBAAsB,CAAC,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;KAC3G;IACD,OAAO,2BAA2B,CAAC,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CACrB,YAAoC,EACpC,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,IAAI,OAAO,YAAY,KAAK,QAAQ,EACpC;QACI,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;KACxG;IACD,OAAO,IAAI,QAAQ,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAC9C,IAAI,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB;IACrE,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EACtD;QACI,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACpC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CACxB,YAAoC,EACpC,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,IAAM,WAAW,GAAG,cAAc,CAAC,IAAsB,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,cAAI,IAAI,QAAC,KAAK,CAAC,IAAI,CAAC,EAAZ,CAAY,CAAC,EAC3E;QACI,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;KACxC;IACD,OAAO,sBAAsB,CACzB,WAAW,CAAC,IAAI,EAChB,wBAAwB,EACxB,mBAAmB,CAAC,YAAY,CAAC,EACjC,UAAU,CACb,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CACvB,YAAoC,EACpC,cAA8B,EAC9B,UAAiC,EACjC,UAAkB;IAElB,IAAM,WAAW,GAAG,cAAc,CAAC,IAAsB,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,cAAI,IAAI,QAAC,KAAK,CAAC,IAAI,CAAC,EAAZ,CAAY,CAAC,EAC3E;QACI,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,eAAK,IAAI,QAAC,CAAC,KAAK,EAAP,CAAO,CAAC,CAAC,CAAC;KAC9D;IACD,OAAO,sBAAsB,CACzB,cAAc,CAAC,IAAI,CAAC,IAAI,EACxB,wBAAwB,EACxB,mBAAmB,CAAC,YAAY,CAAC,EACjC,UAAU,CACb,CAAC;AACN,CAAC;;;ACruBkG;AAC5C;AACS;AAMrC;AA4B3B;;;;GAIG;AACI,SAAS,eAAe,CAAC,kBAA2C,EAAE,OAAqC;IAArC,sCAAqC;IAE9G,OAAO,UAAC,MAAc,EAAE,OAAwB;QAE5C,IAAM,aAAa,GAAG,yBAAuB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,OAAO,CAAG,CAAC,CAAC,sBAAsB;QAEpH,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EACnC;YACI,QAAQ,CAAI,aAAa,kEAA+D,CAAC,CAAC;YAC1F,OAAO;SACV;QAED,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EACxC;YACI,QAAQ,CAAI,aAAa,8CAA2C,CAAC,CAAC;YACtE,OAAO;SACV;QAED,0GAA0G;QAC1G,IAAI,0BAA0B,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,EAC/F;YACI,QAAQ,CAAI,aAAa,oCAA+B,wBAA0B,CAAC,CAAC;YACpF,OAAO;SACV;QAED,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE;YACvC,IAAI,EAAE,eAAe,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC;YAC3E,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;YACnC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE;YACxC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAEM,SAAS,eAAe,CAAC,WAA2B,EAAE,UAAkB;IAC3E,IAAI,IAAI,GAAG,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;QACjC,IAAI,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;KACxC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;;;;;;;;;;;;;;ACrFuE;AACK;AACY;AACL;AACV;AACV;AACe;AAG5B;AAwCnD;IAkLI;;;;;OAKG;IACH,mBAAY,eAAgC,EAAE,QAA6B;QAjB3E,YAAY;QAEJ,eAAU,GAAe,IAAI,qBAAU,EAAE,CAAC;QAC1C,iBAAY,GAAoB,IAAI,yBAAY,EAAK,CAAC;QACtD,qBAAgB,GAA4B,EAAE,CAAC;QAC/C,WAAM,GAAW,CAAC,CAAC;QAcvB,IAAI,YAAY,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAE1E,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC,kBAAkB,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,EACnG;YACI,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;SACjG;QAED,IAAI,CAAC,YAAY,GAAG,UAAC,IAAI,IAAK,aAAM,CAAC,IAAI,CAAC,EAAZ,CAAY,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,UAAC,KAAK,IAAK,eAAQ,CAAC,KAAK,CAAC,EAAf,CAAe,CAAC;QAE/C,IAAI,QAAQ,EACZ;YACI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACzB;aACI,IAAI,SAAS,CAAC,aAAa,EAChC;YACI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnB;IACL,CAAC;IA3MD,gBAAgB;IACF,eAAK,GAAnB,UACI,MAAW,EAAE,QAAyB,EAAE,QAA6B;QAErE,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAgCa,sBAAY,GAA1B,UACI,MAAW,EACX,WAA4B,EAC5B,QAA6B,EAC7B,UAAmB;QAEnB,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,UAAiB,CAAC,CAAC;IACxF,CAAC;IAEa,oBAAU,GAAxB,UACI,MAAW,EAAE,WAA4B,EAAE,QAA6B;QAExE,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAEa,oBAAU,GAAxB,UACI,MAAW,EACX,OAAwB,EACxB,SAA0B,EAC1B,QAA6B;QAE7B,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEa,qBAAW,GAAzB,UACI,MAAS,EAAE,QAAyB,EAAE,QAA6B;QAEnE,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAoBa,sBAAY,GAA1B,UACI,MAAa,EAAE,WAA4B,EAAE,UAAgB,EAAE,QAA6B;QAE5F,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC;IAEa,oBAAU,GAAxB,UACI,MAAc,EAAE,WAA4B,EAAE,QAA6B;QAE3E,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAEa,oBAAU,GAAxB,UACI,MAAiB,EACjB,OAAwB,EACxB,SAA0B,EAC1B,QAA6B;QAE7B,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEa,mBAAS,GAAvB,UACI,MAAS,EAAE,QAAyB,EAAE,QAA6B;QAEnE,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAoBa,0BAAgB,GAA9B,UACI,MAAa,EAAE,WAA4B,EAAE,UAAgB,EAAE,QAA6B;QAE5F,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrF,CAAC;IAEa,wBAAc,GAA5B,UACI,MAAc,EAAE,WAA4B,EAAE,QAA6B;QAE3E,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;IAEa,wBAAc,GAA5B,UACI,MAAiB,EACjB,OAAwB,EACxB,SAA0B,EAC1B,QAA6B;QAE7B,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAIa,yBAAe,GAA7B,UAA8B,MAA0B;QAEpD,IAAI,IAAI,CAAC,aAAa,EACtB;YACI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;SAC7C;aAED;YACI,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;SAC/B;IACL,CAAC;IA0CD;;;OAGG;IACI,0BAAM,GAAb,UAAc,QAA4B;QAEtC,IAAI,SAAS,CAAC,aAAa,EAC3B;YACI,QAAQ,GAAG,gCACJ,SAAS,CAAC,aAAa,GACvB,QAAQ,CACd,CAAC;YAEF,IAAI,QAAQ,CAAC,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,UAAU,EAC7D;gBACI,wEAAwE;gBACxE,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CACpC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CACjE,CAAC,CAAC;aACN;SACJ;QAED,IAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;QAEpC,IAAI,QAAQ,CAAC,YAAY,EACzB;YACI,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAC1D;QAED,IAAI,QAAQ,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACzD,IAAI,QAAQ,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpF,IAAI,QAAQ,CAAC,eAAe;YAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3F,IAAI,QAAQ,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEnD,IAAI,QAAQ,CAAC,YAAY,EACzB;YACI,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACzD,sBAAsB;SACzB;QAED,IAAI,QAAQ,CAAC,UAAU,EACvB;YACI,iEAAiE;YACjE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,UAAC,SAAS,EAAE,CAAC;gBAErC,2CAA2C;gBAC3C,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,IAAI,EAC1D;oBACI,UAAU,CACN,8EAA4E,CAAC,OAAI,CAAC,CAAC;iBAC1F;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC;SAC/C;IACL,CAAC;IAED;;;;;OAKG;IACI,yBAAK,GAAZ,UAAa,MAAW;QAAxB,iBAmCC;QAjCG,IAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAE3D,IAAI,YAAY,GAAG,2BAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/E,IAAI,MAAmB,CAAC;QACxB,IAAI,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;QAE7C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAG,IAAI,UAAG,EAAH,CAAG,CAAC,CAAC,OAAO,CAAC,uBAAa;YAE1D,UAAU,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,EAChB;YACI,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,uBAAa;gBAEzC,UAAU,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;SACN;QAED,IACA;YACI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CACzC,IAAI,EACJ,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,EAC1C,UAAU,CACR,CAAC;SACV;QACD,OAAO,CAAC,EACR;YACI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAQM,gCAAY,GAAnB,UAAoB,MAAW,EAAE,UAAsB;QAAtB,2CAAsB;QAEnD,IAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAC5C,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,EACvE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAC7C,CAAC;IACN,CAAC;IAEM,8BAAU,GAAjB,UAAkB,MAAW;QAEzB,IAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAC5C,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAC7C,CAAC;IACN,CAAC;IAEM,8BAAU,GAAjB,UAAqB,MAAW,EAAE,cAA+B;QAE7D,IAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CACvC,IAAI,EACJ,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,EAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAC7C,CAAC;IACN,CAAC;IAED;;;;OAIG;IACI,+BAAW,GAAlB,UAAmB,MAAS;QAExB,IACA;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACrC,MAAM,EACN,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAC7C,CAAC;SACL;QACD,OAAO,CAAC,EACR;YACI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;IACL,CAAC;IAOM,gCAAY,GAAnB,UAAoB,MAAa,EAAE,UAAyB;QAAzB,2CAAyB;QAExD,IACA;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACrC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;SACxF;QACD,OAAO,CAAC,EACR;YACI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;IACL,CAAC;IAEM,8BAAU,GAAjB,UAAkB,MAAc;QAE5B,IACA;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;SACjF;QACD,OAAO,CAAC,EACR;YACI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;IACL,CAAC;IAEM,8BAAU,GAAjB,UACI,MAAiB,EAAE,cAA+B;QAElD,IACA;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;SACjG;QACD,OAAO,CAAC,EACR;YACI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;IACL,CAAC;IAED;;;;;;OAMG;IACI,6BAAS,GAAhB,UAAiB,MAAS;QAEtB,IAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,OAAO,EAAE,CAAC;SACb;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAOM,oCAAgB,GAAvB,UAAwB,MAAa,EAAE,UAAe;QAElD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7F,CAAC;IAEM,kCAAc,GAArB,UAAsB,MAAc;QAEhC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAEM,kCAAc,GAArB,UAAyB,MAAiB,EAAE,cAA+B;QAEvE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/F,CAAC;IAEO,kCAAc,GAAtB,UAAuB,YAAqC;QAA5D,iBAOC;QALG,IAAI,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;QAE9C,YAAY,CAAC,MAAM,CAAC,cAAI,IAAI,WAAI,EAAJ,CAAI,CAAC,CAAC,OAAO,CAAC,cAAI,IAAI,UAAG,CAAC,GAAG,CAAC,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAtC,CAAsC,CAAC,CAAC;QAE1F,OAAO,GAAG,CAAC;IACf,CAAC;IACL,gBAAC;AAAD,CAAC;;;;ACtf8E;AACf;AAgFzD,SAAS,UAAU,CAAmB,eAAyD;IAElG,IAAI,OAA8B,CAAC;IAEnC,IAAI,OAAO,eAAe,KAAK,UAAU,EACzC;QACI,qDAAqD;QACrD,OAAO,GAAG,EAAE,CAAC;KAChB;SAED;QACI,mDAAmD;QACnD,OAAO,GAAG,eAAe,IAAI,EAAE,CAAC;KACnC;IAED,SAAS,SAAS,CACd,MAAuB;QAEvB,8CAA8C;QAC9C,IAAI,cAAc,GAAG,2BAAkB,CAAC,wBAAwB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEnF,2BAA2B;QAC3B,cAAc,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACzC,cAAc,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;QACjE,cAAc,CAAC,6BAA6B,GAAG,OAAO,CAAC,mBAAmB,CAAC;QAE3E,IAAI,OAAO,CAAC,YAAY,EACxB;YACI,cAAc,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;SACtD;QACD,IAAI,OAAO,CAAC,eAAe,EAC3B;YACI,cAAc,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;SAC5D;QAED,gCAAgC;QAChC,cAAc,CAAC,mBAAmB,GAAG,OAAO,CAAC,WAAkB,CAAC;QAChE,IAAI,OAAO,CAAC,IAAI,EAChB;YACI,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;SACtC;QACD,IAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,WAAW,EACf;YACI,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;SACxC;QAED,IAAI,OAAO,CAAC,UAAU,EACtB;YACI,OAAO,CAAC,UAAU;iBACb,MAAM,CAAC,mBAAS,IAAI,QAAC,CAAC,SAAS,EAAX,CAAW,CAAC;iBAChC,OAAO,CAAC,mBAAS,IAAI,qBAAc,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAxC,CAAwC,CAAC,CAAC;SACvE;IACL,CAAC;IAED,IAAI,OAAO,eAAe,KAAK,UAAU,EACzC;QACI,qDAAqD;QACrD,SAAS,CAAC,eAAe,CAAC,CAAC;KAC9B;SAED;QACI,mDAAmD;QACnD,OAAO,SAAS,CAAC;KACpB;AACL,CAAC;AAED,SAAS,UAAU,CAAI,MAAuB;IAC1C,OAAM;AACV,CAAC;;;ACrJkB;AACoC;AACS;AAOrC;AA8CpB,SAAS,UAAU,CACtB,kBAAuD,EACvD,OAAyB;IAEzB,IAAI,OAAO,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,EAC3E;QACI,IAAM,SAAS,GAAG,kBAAmC,CAAC;QACtD,sBAAsB;QACtB,IAAM,aAAa,GAAG,oBAAkB,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,OAAO,CAAG,CAAC;QAE3F,qGAAqG;QACrG,yDAAyD;QACzD,IAAI,0BAA0B,EAC9B;YACI,IAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAa,CAAC;YAE3F,IAAI,CAAC,eAAe,EACpB;gBACI,QAAQ,CAAI,aAAa,sEAAiE,wBAA0B,CAAC,CAAC;gBACtH,OAAO;aACV;YAED,IAAM,cAAc,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAC7D,IAAI,qBAAqB,CAAC,aAAa,EAAE,cAAc,CAAC,EACxD;gBACI,OAAO;aACV;YAED,yBAAyB,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC1C,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;gBACvB,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE;aAC3B,CAAC,CAAC;SACN;aAED;YACI,QAAQ,CAAI,aAAa,6EAA0E,CAAC,CAAC;YACrG,OAAO;SACV;KACJ;SAED;QACI,0CAA0C;QAC1C,OAAO,UAAC,MAAc,EAAE,QAAyB;YAE7C,IAAI,OAAO,GAAuB,kBAAwC,IAAI,EAAE,CAAC;YACjF,IAAI,cAAwC,CAAC;YAC7C,IAAI,aAAa,GAAG,oBAAkB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,QAAQ,CAAG,CAAC,CAAC,sBAAsB;YAE9G,IAAI,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,EACzC;gBACI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EACxC;oBACI,QAAQ,CAAI,aAAa,gEAA6D,CAAC,CAAC;oBACxF,OAAO;iBACV;gBAED,2IAA2I;gBAC3I,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,0BAA0B,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,EACzH;oBACI,UAAU,CAAI,aAAa,kEAA+D,CAAC,CAAC;iBAC/F;aACJ;iBAED;gBACI,wDAAwD;gBACxD,IAAI,0BAA0B,EAC9B;oBACI,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAa,CAAC;oBAErF,IAAI,CAAC,WAAW,EAChB;wBACI,QAAQ,CAAI,aAAa,+DAA4D,CAAC,CAAC;wBACvF,OAAO;qBACV;oBACD,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;iBACtD;qBACI,IAAI,CAAC,OAAO,CAAC,YAAY,EAC9B;oBACI,QAAQ,CAAI,aAAa,6EAA0E,CAAC,CAAC;oBACrG,OAAO;iBACV;aACJ;YAGD,IAAI,cAAc,IAAI,qBAAqB,CAAC,aAAa,EAAE,cAAc,CAAC,EAC1E;gBACI,OAAO;aACV;YACD,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE;gBACxC,IAAI,EAAE,cAAc;gBACpB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;gBACnC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACzC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;aACjC,CAAC,CAAC;QACP,CAAC,CAAC;KACL;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB,EAAE,cAA8B;IAEhF,IAAI,CAAC,CAAC,cAAc,YAAY,mBAAmB,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,KAAK,EACrF;QACI,QAAQ,CAAI,aAAa,iEAA8D;cACjF,2BAA2B,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;KACf;IAED,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EACjF;QACI,QAAQ,CAAI,aAAa,4DAAyD;cAC5E,2BAA2B,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;KACf;IAED,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EACjF;QACI,QAAQ,CAAI,aAAa,4DAAyD;cAC5E,2BAA2B,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;;;ACzLkG;AAC5C;AACS;AACX;AAyBrD;;;;;GAKG;AACI,SAAS,aAAa,CAAC,kBAA4B,EAAE,OAAmC;IAAnC,sCAAmC;IAE3F,OAAO,UAAC,MAAc,EAAE,OAAwB;QAE5C,IAAM,aAAa,GAAG,uBAAqB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,OAAO,CAAG,CAAC,CAAC,sBAAsB;QAElH,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EACnC;YACI,QAAQ,CAAI,aAAa,gEAA6D,CAAC,CAAC;YACxF,OAAO;SACV;QAED,kHAAkH;QAClH,IAAI,0BAA0B,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,EAC7F;YACI,QAAQ,CAAI,aAAa,iCAA4B,wBAA0B,CAAC,CAAC;YACjF,OAAO;SACV;QAED,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE;YACvC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC;YAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;YACnC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE;YACxC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;;;AChEkG;AAC5C;AACS;AACiB;AAyBjF;;;;;;GAMG;AACI,SAAS,aAAa,CACzB,cAAuC,EACvC,gBAAyC,EACzC,OAAmC;IAAnC,sCAAmC;IAEnC,OAAO,UAAC,MAAc,EAAE,OAAwB;QAE5C,IAAM,aAAa,GAAG,uBAAqB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAI,MAAM,CAAC,OAAO,CAAG,CAAC,CAAC,sBAAsB;QAElH,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAC/B;YACI,QAAQ,CAAI,aAAa,4DAAyD,CAAC,CAAC;YACpF,OAAO;SACV;QAED,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACjC;YACI,QAAQ,CAAI,aAAa,8DAA2D,CAAC,CAAC;YACtF,OAAO;SACV;QAED,kHAAkH;QAClH,IAAI,0BAA0B,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,EAC7F;YACI,QAAQ,CAAI,aAAa,iCAA4B,wBAA0B,CAAC,CAAC;YACjF,OAAO;SACV;QAED,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE;YACvC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAC,CAAC;YACpE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;YACnC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE;YACxC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;;;AC1EqC;AAyB/B,SAAS,MAAM,CAAmB,eAA0C;IAE/E,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE;QACvC,gBAAgB;QAChB,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO;KACV;IACD,oBAAoB;IACpB,OAAO,UAAC,MAAgB;QACpB,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAmB,MAAgB,EAAE,OAAuB;IAChF,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QAC/C,MAAM,IAAI,KAAK,CAAI,MAAM,CAAC,IAAI,iCAA8B,CAAC,CAAC;KACjE;IACD,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG;QACtB,OAAO,gBAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;AACL,CAAC;;;AC7CD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA6G;AACpB;AACpC;AACA;AACW;AACJ;AACA;AACf;AACoB","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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import { Serializable } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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 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: Serializable): 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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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: Serializable): 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 public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata\n {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = 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 objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n return objectMetadata;\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 = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n public knownTypes = new Set>();\n /** If present override the global function */\n public typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n public typeResolver?: TypeResolver;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === \"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 prototype[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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 getTypeHintEmitter(): TypeHintEmitter\n {\n return this.typeHintEmitter;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`),\n );\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else\n {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter)\n {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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\n // to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: any[],\n typeDescriptor: TypeDescriptor,\n memberName:string ,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | { key: any, value: any }[] {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\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: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction 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 */\nfunction 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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView)\n{\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import { isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeResolver } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject, knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 public options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this.nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n public getTypeResolver(): TypeResolver\n {\n return this.typeResolver;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer)\n {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`),\n );\n }\n\n public instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n public 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 public 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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string)\n{\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor)\n {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject|T|undefined {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`)\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver)\n {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = 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 = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 ${memberName}:`\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 ${memberName}:`\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 deserializer.getErrorHandler()(e);\n return undefined;\n }\n }\n else\n {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n deserializer.getErrorHandler()(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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n }\n catch (e)\n {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n })\n }\n else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 {\n return new Date(sourceObject as any);\n }\n else if (sourceObject instanceof Date)\n {\n return sourceObject\n }\n else\n {\n throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++)\n {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject, Serializable } from \"./typedjson/types\";\nimport { Serializer, defaultTypeEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, defaultTypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport { defaultTypeResolver, defaultTypeEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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: Serializable, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\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: Serializable, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertSingleValue(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Serializable): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertSingleValue(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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.convertSingleValue(object, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(\n object: Map, keyConstructor: Serializable,\n ): IndexedObject | { key: any, value: any }[] | undefined {\n try\n {\n return this.serializer.convertSingleValue(object, MapT(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: Serializable): 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","import { Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Function[];\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable\n): ((target: Serializable) => 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: Serializable\n ): void {\n // Create or obtain JsonObjectMetadata object.\n let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver)\n {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter)\n {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes)\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\nfunction isSubClass(target: Serializable) {\n return\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\nimport { IndexedObject } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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\", prototype, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\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 = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from \"./parser\";\nexport { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from \"./typedjson/metadata\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index db45b1b..39d7c37 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.6.0-rc1 - 2020-07-15 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r(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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\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 type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: 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.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n isDirectlySerializableNativeType,\n isInstanceOf,\n isTypeTypedArray,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nfunction defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private _typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private _errorHandler: (error: Error) => void = logError;\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n if (isDirectlySerializableNativeType(typeDescriptor.ctor))\n {\n return sourceObject;\n }\n else if (typeDescriptor.ctor === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeDescriptor.ctor === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n return this.convertAsArray(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n return this.convertAsSet(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n return this.convertAsMap(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n else if (isTypeTypedArray(typeDescriptor.ctor))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, memberName, memberOptions);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\n public convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName?: string,\n memberOptions?: OptionsBase,\n ) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else \n {\n this._errorHandler(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(this.options, sourceMeta.options);\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = this.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (this.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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, typeDescriptor.ctor, 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 memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsArray(\n sourceObject: any[],\n typeDescriptor: ArrayTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(this.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => this.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements\n * (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n * @returns\n */\n public convertAsSet(\n sourceObject: Set,\n typeDescriptor: SetTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = this.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param memberOptions If converted as a member, the member options.\n */\n public convertAsMap(\n sourceObject: Map,\n typeDescriptor: MapTypeDescriptor,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): IndexedObject|Array<{ key: any, value: any }> {\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = this.retrievePreserveNull(memberOptions);\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, typeDescriptor.keyType, memberName, memberOptions),\n value: this.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * 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\n * returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { isDirectlyDeserializableNativeType, isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function|undefined|null;\n\nfunction defaultTypeResolver(sourceObject: any, knownTypes: Map): Function|undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\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 public options?: OptionsBase;\n\n private _typeResolver: TypeResolver = defaultTypeResolver;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void = logError;\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\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 typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n objectName = \"object\",\n memberOptions?: OptionsBase,\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 = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = 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 const 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 const classOptions = mergeOptions(this.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = this.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (this.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else 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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ) {\n const expectedTypeIsConcrete = typeDescriptor instanceof ConcreteTypeDescriptor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n else if (expectedTypeIsConcrete && isDirectlyDeserializableNativeType(typeDescriptor.ctor))\n {\n if (sourceObject.constructor === typeDescriptor.ctor)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, memberName));\n }\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 if (sourceObject instanceof Date)\n return sourceObject\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedTypeIsConcrete && (typeDescriptor.ctor === Float32Array || typeDescriptor.ctor === Float64Array))\n {\n // Deserialize Float Array from number[].\n return this._convertAsFloatArray(\n sourceObject,\n typeDescriptor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (\n expectedTypeIsConcrete && (\n typeDescriptor.ctor === Uint8Array\n || typeDescriptor.ctor === Uint8ClampedArray\n || typeDescriptor.ctor === Uint16Array\n || typeDescriptor.ctor === Uint32Array\n )\n ) {\n // Deserialize Uint array from number[].\n return this._convertAsUintArray(\n sourceObject,\n typeDescriptor.ctor as any,\n srcTypeNameForDebug,\n memberName,\n );\n }\n else if (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (expectedTypeIsConcrete && typeDescriptor.ctor === 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 (typeDescriptor instanceof ArrayTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (typeDescriptor instanceof SetTypeDescriptor)\n {\n if (Array.isArray(sourceObject))\n return this.convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (typeDescriptor instanceof MapTypeDescriptor)\n {\n if (this.isExpectedMapShape(sourceObject, typeDescriptor.getCompleteOptions().shape))\n {\n return this.convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n else\n {\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, memberOptions);\n }\n }\n\n public convertAsArray(\n sourceObject: any,\n typeDescriptor: ArrayTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any[] {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n return sourceObject.map(element => {\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(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\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(\n sourceObject: any,\n typeDescriptor: SetTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Set {\n if (!(Array.isArray(sourceObject)))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\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 const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(this.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(\n sourceObject: any,\n typeDescriptor: MapTypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): Map {\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!this.isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)));\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = this.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n this.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = this.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n this.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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\n return resultMap;\n }\n\n private _convertAsFloatArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject);\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _convertAsUintArray(\n sourceObject: any,\n arrayType: Constructor,\n srcTypeNameForDebug: string,\n memberName: string,\n ): T {\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n return new arrayType(sourceObject.map(value => ~~value));\n return this._throwTypeMismatchError(\n arrayType.name,\n \"a numeric source array\",\n srcTypeNameForDebug,\n memberName,\n );\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n ): never {\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: string)\n {\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const 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 _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 private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n private retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject } from \"./typedjson/types\";\nimport { Serializer, TypeHintEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, TypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\nexport { TypeResolver, TypeHintEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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 ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(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 rootConstructor 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertAsArray(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertAsSet(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertAsMap(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertAsArray(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): IndexedObject|{ key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, MapT(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","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * 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 objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n \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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\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, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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 as Object;\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: typeDescriptor,\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 typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, TypeResolver, TypeHintEmitter } from \"./parser\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","undefined","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","assign","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeEmitter","targetObject","sourceObject","expectedSourceType","sourceTypeMetadata","__type","setTypeHintEmitter","typeEmitterCallback","TypeError","getTypeHintEmitter","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","retrievePreserveNull","memberOptions","convertSingleValue","typeDescriptor","memberName","serializer","serializationStrategy","get","beforeSerializationMethodName","objMemberMetadata","serialized","objMemberOptions","convertAsObject","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsArray","convertAsSet","convertAsMap","convertAsTypedArray","element","i","expectedTypeName","actualTypeName","map","resultArray","resultElement","push","resultShape","result","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","defaultTypeResolver","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","getTypeResolver","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","revivedValue","objMemberValue","objMemberDebugName","isRequired","initializerCallback","e","instantiateType","onDeserializedMethodName","sourceKey","knownTypeMaps","knowTypes","knownTypeMeta","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","resultSet","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import { Serializable } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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 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: Serializable): 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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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: Serializable): 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 public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata\n {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = 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 objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n return objectMetadata;\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 = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n public knownTypes = new Set>();\n /** If present override the global function */\n public typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n public typeResolver?: TypeResolver;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === \"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 prototype[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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 getTypeHintEmitter(): TypeHintEmitter\n {\n return this.typeHintEmitter;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`),\n );\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else\n {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter)\n {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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\n // to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: any[],\n typeDescriptor: TypeDescriptor,\n memberName:string ,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | { key: any, value: any }[] {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\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: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction 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 */\nfunction 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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView)\n{\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import { isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeResolver } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject, knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 public options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this.nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n public getTypeResolver(): TypeResolver\n {\n return this.typeResolver;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer)\n {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`),\n );\n }\n\n public instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n public 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 public 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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string)\n{\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor)\n {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject|T|undefined {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`)\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver)\n {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = 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 = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 ${memberName}:`\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 ${memberName}:`\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 deserializer.getErrorHandler()(e);\n return undefined;\n }\n }\n else\n {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n deserializer.getErrorHandler()(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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n }\n catch (e)\n {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n })\n }\n else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 {\n return new Date(sourceObject as any);\n }\n else if (sourceObject instanceof Date)\n {\n return sourceObject\n }\n else\n {\n throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++)\n {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject, Serializable } from \"./typedjson/types\";\nimport { Serializer, defaultTypeEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, defaultTypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport { defaultTypeResolver, defaultTypeEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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: Serializable, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\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: Serializable, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertSingleValue(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Serializable): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertSingleValue(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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.convertSingleValue(object, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(\n object: Map, keyConstructor: Serializable,\n ): IndexedObject | { key: any, value: any }[] | undefined {\n try\n {\n return this.serializer.convertSingleValue(object, MapT(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: Serializable): 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","import { Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Function[];\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable\n): ((target: Serializable) => 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: Serializable\n ): void {\n // Create or obtain JsonObjectMetadata object.\n let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver)\n {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter)\n {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes)\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\nfunction isSubClass(target: Serializable) {\n return\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\nimport { IndexedObject } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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\", prototype, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\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 = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from \"./parser\";\nexport { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from \"./typedjson/metadata\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/deserializer.d.ts b/js/typedjson/deserializer.d.ts index 586311e..fdd4b33 100644 --- a/js/typedjson/deserializer.d.ts +++ b/js/typedjson/deserializer.d.ts @@ -1,33 +1,28 @@ import { IndexedObject } from "./types"; +import { TypeResolver } from "./metadata"; import { OptionsBase } from "./options-base"; -import { ArrayTypeDescriptor, ConcreteTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor } from "./type-descriptor"; -export declare type TypeResolver = (sourceObject: Object, knownTypes: Map) => Function | undefined | null; +import { TypeDescriptor } from "./type-descriptor"; +export declare function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined; +export declare type DeserializerFn = (sourceObject: Raw, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName: string, deserializer: Deserializer, memberOptions?: OptionsBase) => T; /** * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. * It is used after parsing a JSON-string. */ export declare class Deserializer { options?: OptionsBase; - private _typeResolver; - private _nameResolver?; - private _errorHandler; + private typeResolver; + private nameResolver?; + private errorHandler; + private deserializationStrategy; setNameResolver(nameResolverCallback: (ctor: Function) => string): void; setTypeResolver(typeResolverCallback: TypeResolver): void; + getTypeResolver(): TypeResolver; setErrorHandler(errorHandlerCallback: (error: Error) => void): void; - convertAsObject(sourceObject: IndexedObject, typeDescriptor: ConcreteTypeDescriptor, knownTypes: Map, objectName?: string, memberOptions?: OptionsBase): {} | undefined; + getErrorHandler(): (error: Error) => void; convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): any; - convertAsArray(sourceObject: any, typeDescriptor: ArrayTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): any[]; - convertAsSet(sourceObject: any, typeDescriptor: SetTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): Set; - convertAsMap(sourceObject: any, typeDescriptor: MapTypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): Map; - private _convertAsFloatArray; - private _convertAsUintArray; - private _throwTypeMismatchError; - private _makeTypeErrorMessage; - private _instantiateType; - private _mergeKnownTypes; - private _createKnownTypesMap; - private _stringToArrayBuffer; - private _stringToDataView; + instantiateType(ctor: any): any; + mergeKnownTypes(...knownTypeMaps: Array>): Map; + createKnownTypesMap(knowTypes: Set): Map; private isExpectedMapShape; - private retrievePreserveNull; + retrievePreserveNull(memberOptions?: OptionsBase): boolean; } diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts index 2a8b605..aeac3d8 100644 --- a/js/typedjson/helpers.d.ts +++ b/js/typedjson/helpers.d.ts @@ -1,8 +1,5 @@ -export declare const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; +import { Serializable } from './types'; export declare const MISSING_REFLECT_CONF_MSG: string; -export declare function getDefaultValue(type: { - new (): T; -}): T | undefined; /** * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. * Values of these types don't need special conversion. @@ -11,9 +8,8 @@ export declare function getDefaultValue(type: { export declare function isDirectlySerializableNativeType(type: Function): boolean; export declare function isDirectlyDeserializableNativeType(type: Function): boolean; 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; +export declare function parseToJSObject(json: any, expectedType: Serializable): Object; /** * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B'). * @param A The supposed derived type. @@ -37,3 +33,4 @@ export declare const isReflectMetadataSupported: boolean; export declare function nameof(fn: Function & { name?: string; }): string; +export declare function identity(arg: T): T; diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts index 303c4b0..627d9f5 100644 --- a/js/typedjson/json-member.d.ts +++ b/js/typedjson/json-member.d.ts @@ -1,5 +1,6 @@ import { OptionsBase } from "./options-base"; import { TypeDescriptor } from "./type-descriptor"; +import { IndexedObject } from './types'; export interface IJsonMemberOptions extends OptionsBase { /** * Sets the constructor of the property. @@ -19,12 +20,13 @@ export interface IJsonMemberOptions extends OptionsBase { } /** * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared. + * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly + * declared. * @param options Additional options. */ -export declare function jsonMember(options: IJsonMemberOptions): PropertyDecorator; +export declare function jsonMember(options: IJsonMemberOptions): PropertyDecorator; /** * Specifies that a property is part of the object when serializing. * This call signature requires ReflectDecorators and that the property type is always explicitly declared. */ -export declare function jsonMember(target: Object, propertyKey: string | symbol): void; +export declare function jsonMember(prototype: IndexedObject, propertyKey: string | symbol): void; diff --git a/js/typedjson/json-object.d.ts b/js/typedjson/json-object.d.ts index 7da0b64..ce6b712 100644 --- a/js/typedjson/json-object.d.ts +++ b/js/typedjson/json-object.d.ts @@ -1,12 +1,21 @@ -import { Constructor, ParameterlessConstructor } from "./types"; +import { Serializable } from "./types"; +import { TypeHintEmitter, TypeResolver } from "./metadata"; import { OptionsBase } from "./options-base"; export declare type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; export interface IJsonObjectOptionsBase extends OptionsBase { /** - * An array of known types to recognize when encountering type-hints, - * or the name of a static method used for determining known types. + * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Function[] | string; + knownTypes?: Function[]; + /** + * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. + */ + typeHintEmitter?: TypeHintEmitter; + /** + * A function that given a source object will resolve the type that should be instantiated. + * It will override the global type resolver. + */ + typeResolver?: TypeResolver; /** * The name of a static or instance method to call when deserialization * of the object is completed. @@ -45,13 +54,13 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase { * settings. The 'initializer' setting must be specified. * @param options Configuration settings. */ -export declare function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void; +export declare function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => void; /** * Marks that a class is serializable using TypedJSON, with additional settings. * @param options Configuration settings. */ -export declare function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void; +export declare function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void; /** * Marks that a class with a parameterless constructor is serializable using TypedJSON. */ -export declare function jsonObject(target: ParameterlessConstructor): void; +export declare function jsonObject(target: Serializable): void; diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts index ec0a45f..17da64d 100644 --- a/js/typedjson/metadata.d.ts +++ b/js/typedjson/metadata.d.ts @@ -1,6 +1,9 @@ -import { IndexedObject } from "./types"; +import { IndexedObject, Serializable } from "./types"; import { OptionsBase } from "./options-base"; import { TypeDescriptor } from "./type-descriptor"; +export declare const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; +export declare type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null; +export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ emitDefaultValue?: boolean; @@ -8,7 +11,7 @@ export interface JsonMemberMetadata { name: string; /** Property or field key of the json member. */ key: string; - /** Constuctor (type) reference of the member. */ + /** Type descriptor of the member. */ type?: TypeDescriptor; /** If set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -28,7 +31,8 @@ export declare class JsonObjectMetadata { * Gets jsonObject metadata information from a class. * @param ctor The constructor class. */ - static getFromConstructor(ctor: Function): JsonObjectMetadata | undefined; + static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined; + static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata; /** * Gets the known type name of a jsonObject class for type hint. * @param constructor The constructor class. @@ -37,8 +41,12 @@ export declare class JsonObjectMetadata { private static doesHandleWithoutAnnotation; constructor(classType: Function); dataMembers: Map; - knownTypes: Set; - knownTypeMethodName?: string; + /** Set of known types used for polymorphic deserialization */ + knownTypes: Set>; + /** If present override the global function */ + typeHintEmitter?: TypeHintEmitter; + /** If present override the global function */ + typeResolver?: TypeResolver; /** Gets or sets the constructor function for the jsonObject. */ classType: Function; /** @@ -58,4 +66,4 @@ export declare class JsonObjectMetadata { beforeSerializationMethodName?: string; initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; } -export declare function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata): void; +export declare function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata): void; diff --git a/js/typedjson/serializer.d.ts b/js/typedjson/serializer.d.ts index 2012aa5..e5cc075 100644 --- a/js/typedjson/serializer.d.ts +++ b/js/typedjson/serializer.d.ts @@ -1,8 +1,16 @@ import { IndexedObject } from "./types"; -import { JsonObjectMetadata } from "./metadata"; +import { JsonObjectMetadata, TypeHintEmitter } from "./metadata"; import { OptionsBase } from "./options-base"; -import { ArrayTypeDescriptor, ConcreteTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor } from "./type-descriptor"; -export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; +import { TypeDescriptor } from "./type-descriptor"; +export declare function defaultTypeEmitter(targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata): void; +/** + * @param sourceObject The original object that should be serialized. + * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization. + * @param memberName Name of the object being serialized, used for debugging purposes. + * @param serializer Serializer instance, aiding with recursive serialization. + * @param memberOptions If converted as a member, the member options. + */ +export declare type SerializerFn = (sourceObject: T, typeDescriptor: TD, memberName: string, serializer: Serializer, memberOptions?: OptionsBase) => Raw; /** * 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 called "simple javascript object"), @@ -15,68 +23,17 @@ export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject */ export declare class Serializer { options?: OptionsBase; - private _typeHintEmitter; - private _errorHandler; + private typeHintEmitter; + private errorHandler; + private serializationStrategy; setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter): void; + getTypeHintEmitter(): TypeHintEmitter; setErrorHandler(errorHandlerCallback: (error: Error) => void): void; + getErrorHandler(): (error: Error) => void; + retrievePreserveNull(memberOptions?: OptionsBase): boolean; /** * Convert a value of any supported serializable type. * The value type will be detected, and the correct serialization method will be called. */ convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any; - /** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ - convertAsObject(sourceObject: IndexedObject, typeDescriptor: ConcreteTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): IndexedObject; - /** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for - * serialization. - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - convertAsArray(sourceObject: any[], typeDescriptor: ArrayTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any[]; - /** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * - * @param sourceObject - * @param expectedElementType The constructor of the expected Set elements - * (e.g. `Number` for `Set`, or `MyClass` for `Set`). - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - * @returns - */ - convertAsSet(sourceObject: Set, typeDescriptor: SetTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any[]; - /** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - * - * @param sourceObject - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param memberOptions If converted as a member, the member options. - */ - convertAsMap(sourceObject: Map, typeDescriptor: MapTypeDescriptor, memberName?: string, memberOptions?: OptionsBase): IndexedObject | Array<{ - key: any; - value: any; - }>; - /** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - * - * @param sourceObject - * @returns - */ - convertAsTypedArray(sourceObject: ArrayBufferView): unknown[]; - /** - * Performs the conversion of a raw ArrayBuffer to a string. - */ - convertAsArrayBuffer(buffer: ArrayBuffer): string; - /** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ - convertAsDataView(dataView: DataView): string; - private retrievePreserveNull; } diff --git a/js/typedjson/types.d.ts b/js/typedjson/types.d.ts index a2cdb45..d7959f9 100644 --- a/js/typedjson/types.d.ts +++ b/js/typedjson/types.d.ts @@ -1,5 +1,8 @@ export declare type IndexedObject = Object & { [key: string]: any; }; +export interface AbstractType extends Function { + prototype: T; +} export declare type Constructor = new (...args: any[]) => T; -export declare type ParameterlessConstructor = new () => T; +export declare type Serializable = Constructor | AbstractType; diff --git a/package-lock.json b/package-lock.json index afec17c..1946e05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0-rc1", + "version": "1.6.0-rc2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a45622b..919df57 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0-rc1", + "version": "1.6.0-rc2", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", From 8b0948135ed1b94e7fa189639f4a9bc1ee862b92 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 13:05:08 +0000 Subject: [PATCH 010/119] Improve TypeScript config We now have: - a base tsconfig for project wide settings - a new tsconfig for the spec files, these were not tested before - a tsconfig for the app/src only - a solution style tsconfig file for IDEs --- package.json | 2 +- tsconfig.json | 29 +++++++++++++++-------------- tsconfig/tsconfig.app.json | 9 +++++++++ tsconfig/tsconfig.base.json | 12 ++++++++++++ tsconfig/tsconfig.spec.json | 11 +++++++++++ webpack.config.js | 7 ++++++- 6 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 tsconfig/tsconfig.app.json create mode 100644 tsconfig/tsconfig.base.json create mode 100644 tsconfig/tsconfig.spec.json diff --git a/package.json b/package.json index 919df57..fe23add 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", "scripts": { - "test": "npm run build && nyc ts-node -O '{\"module\": \"commonjs\", \"strict\": false}' node_modules/jasmine/bin/jasmine.js", + "test": "npm run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", "build": "webpack", "preversion": "npm test", "version": "npm run build && git add -A js" diff --git a/tsconfig.json b/tsconfig.json index 6f449b7..5abef11 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,18 @@ -{ - "compilerOptions": { - "target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ - "lib": ["es7", "dom"], - "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - "strict": true, - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language + server to improve development experience. It is not intended to be used to perform a compilation. - "outDir": "js" - }, - "files": [ - "src/typedjson.ts" + To learn more about this file see: + https://devblogs.microsoft.com/typescript/announcing-typescript-3-9/#solution-style-tsconfig. +*/ +{ + "files": [], + "references": [ + { + "path": "./tsconfig/tsconfig.app.json" + }, + { + "path": "./tsconfig/tsconfig.spec.json" + } ] } diff --git a/tsconfig/tsconfig.app.json b/tsconfig/tsconfig.app.json new file mode 100644 index 0000000..4cb65fd --- /dev/null +++ b/tsconfig/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "outDir": "../js" + }, + "files": [ + "../src/typedjson.ts" + ] +} diff --git a/tsconfig/tsconfig.base.json b/tsconfig/tsconfig.base.json new file mode 100644 index 0000000..d4d106a --- /dev/null +++ b/tsconfig/tsconfig.base.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ + "lib": ["es7", "dom"], + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + "strict": true, + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ + } +} diff --git a/tsconfig/tsconfig.spec.json b/tsconfig/tsconfig.spec.json new file mode 100644 index 0000000..3051b86 --- /dev/null +++ b/tsconfig/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "noEmit": true, + "strict": false + }, + "include": [ + "../spec/**/*.ts" + ] +} diff --git a/webpack.config.js b/webpack.config.js index 4f8a928..19d3c7c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -12,7 +12,12 @@ module.exports = { rules: [ { test: /\.[jt]s$/, - use: 'ts-loader', + use: { + loader: 'ts-loader', + options: { + configFile: 'tsconfig/tsconfig.app.json', + }, + }, exclude: /node_modules/, }, ], From f208fef4596e3649329168f6322c9301dda00501 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 13:22:21 +0000 Subject: [PATCH 011/119] Add editorconfig --- .editorconfig | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e57f68a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.json] +indent_size = 2 + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.{yaml,yml}] +indent_size = 2 From 3d611eae4b91ed50c7cde91ba3a3e35b484b1c90 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 13:23:15 +0000 Subject: [PATCH 012/119] Use 4 space indent in webpack.config.js --- webpack.config.js | 104 +++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 19d3c7c..2b177de 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,57 +3,57 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const WebpackAutoInject = require('webpack-auto-inject-version'); module.exports = { - entry: { - 'typedjson': './src/typedjson.ts', - 'typedjson.min': './src/typedjson.ts', - }, - devtool: 'source-map', - module: { - rules: [ - { - test: /\.[jt]s$/, - use: { - loader: 'ts-loader', - options: { - configFile: 'tsconfig/tsconfig.app.json', - }, - }, - exclude: /node_modules/, - }, + entry: { + 'typedjson': './src/typedjson.ts', + 'typedjson.min': './src/typedjson.ts', + }, + devtool: 'source-map', + module: { + rules: [ + { + test: /\.[jt]s$/, + use: { + loader: 'ts-loader', + options: { + configFile: 'tsconfig/tsconfig.app.json', + }, + }, + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: ['.ts', '.js'], + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'js'), + library: 'typedjson', + libraryTarget: 'umd', + umdNamedDefine: true, + globalObject: `(typeof self !== 'undefined' ? self : this)`, + }, + optimization: { + minimizer: [ + new UglifyJsPlugin({ + include: /\.min\.js$/, + sourceMap: true, + }) + ], + }, + plugins: [ + new WebpackAutoInject({ + SHORT: 'typedjson', + components: { + AutoIncreaseVersion: false, + }, + componentsOptions: { + InjectAsComment: { + tag: 'Version: {version} - {date}', + dateFormat: 'isoDate', + }, + }, + }), ], - }, - resolve: { - extensions: [ '.ts', '.js' ], - }, - output: { - filename: '[name].js', - path: path.resolve(__dirname, 'js'), - library: 'typedjson', - libraryTarget: 'umd', - umdNamedDefine: true, - globalObject: `(typeof self !== 'undefined' ? self : this)`, - }, - optimization: { - minimizer: [ - new UglifyJsPlugin({ - include: /\.min\.js$/, - sourceMap: true, - }) - ], - }, - plugins: [ - new WebpackAutoInject({ - SHORT: 'typedjson', - components: { - AutoIncreaseVersion: false, - }, - componentsOptions: { - InjectAsComment: { - tag: 'Version: {version} - {date}', - dateFormat: 'isoDate', - }, - }, - }), - ], - mode: "production", + mode: "production", }; From 4b901ea5bc7d89897a7b210ecb92860fc0af8df2 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 13:25:17 +0000 Subject: [PATCH 013/119] Add linter --- .eslintrc.yaml | 53 + .github/workflows/nodejs.yml | 3 +- .gitignore | 1 + lint-staged.config.js | 13 + package-lock.json | 2336 ++++++++++++++++++++++++++++++++-- package.json | 9 + tsconfig/tsconfig.lint.json | 7 + 7 files changed, 2315 insertions(+), 107 deletions(-) create mode 100644 .eslintrc.yaml create mode 100644 lint-staged.config.js create mode 100644 tsconfig/tsconfig.lint.json diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 0000000..7edccea --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1,53 @@ +--- + +env: + es6: true + node: true + +overrides: + - + files: + - '*.js' + extends: + - '@matthiaskunnen/eslint-config-base' + + - + env: + jasmine: true + files: + - 'spec/**/*.ts' + extends: + - '@matthiaskunnen/eslint-config-typescript' + + parser: '@typescript-eslint/parser' + + parserOptions: + project: + - tsconfig/tsconfig.lint.json + sourceType: module + rules: + '@typescript-eslint/no-use-before-define': off + func-names: off + + - + files: + - 'src/**/*.ts' + extends: + - '@matthiaskunnen/eslint-config-typescript' + + parser: '@typescript-eslint/parser' + + parserOptions: + project: + - tsconfig/tsconfig.lint.json + sourceType: module + rules: + '@typescript-eslint/no-use-before-define': + - error + - + classes: true + enums: true + functions: false + variables: true + typedefs: true + no-prototype-builtins: off # @todo check if this should remain off diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 6318898..97c36fb 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -17,9 +17,10 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - name: npm install, build, and test + - name: npm install, lint, build, and test run: | npm ci + npm run lint npm run build --if-present npm test env: diff --git a/.gitignore b/.gitignore index 33595a7..8eff110 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ nupkg obj Properties temp +.eslintcache .idea .nyc_output *.cs diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..439ad12 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,13 @@ +function mapFilenames(filenames) { + return filenames.map(filename => `"${filename}"`).join(' '); +} + +module.exports = { + '*': () => [ + 'npm run build', + 'npm run test', + ], + '*.ts': (filenames) => [ + `eslint --fix --cache ${mapFilenames(filenames)}`, + ], +}; diff --git a/package-lock.json b/package-lock.json index 1946e05..5e8c738 100644 --- a/package-lock.json +++ b/package-lock.json @@ -179,18 +179,153 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@matthiaskunnen/eslint-config-base": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@matthiaskunnen/eslint-config-base/-/eslint-config-base-1.2.0.tgz", + "integrity": "sha512-vUfDXwuRKi4sQ9H1vt77ekfC9usswHmuJ3G+DzS8jOnbpQFJe7CGmRDxvOAotREVSoC39FlNbG8m56c/yw/Z5w==", + "dev": true, + "requires": { + "eslint": "^7.5.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-unicorn": "^19.0.1" + } + }, + "@matthiaskunnen/eslint-config-typescript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@matthiaskunnen/eslint-config-typescript/-/eslint-config-typescript-1.2.0.tgz", + "integrity": "sha512-8Agbx3rKw1dvg77vvjlCs9LxMl6vxCpr5j1WGvxkTOVAqhDYGilv8Wk/1dGHPVsxZk5ETkj9EvWMyYWPMviHQg==", + "dev": true, + "requires": { + "@matthiaskunnen/eslint-config-base": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^2.31.0", + "@typescript-eslint/eslint-plugin-tslint": "^2.31.0", + "@typescript-eslint/parser": "^2.31.0", + "tslint": "^6.1.2" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/jasmine": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.3.tgz", "integrity": "sha512-LRJ21f/BO4QNZ3YDaMP0OEurOfE77x8mi8MfEnUsei5IKfmZL0GKl7juhABMdUIJHhVS9OCLotKHfsFNAuJ+DA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/eslint-plugin-tslint": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz", + "integrity": "sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.34.0", + "lodash": "^4.17.15" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -385,6 +520,12 @@ "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "dev": true }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -419,6 +560,29 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -612,12 +776,33 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -662,6 +847,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -894,6 +1085,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -963,6 +1160,12 @@ "write-file-atomic": "^3.0.0" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1084,6 +1287,12 @@ "tslib": "^1.9.0" } }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1117,12 +1326,40 @@ } } }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -1171,6 +1408,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1207,6 +1450,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1253,6 +1502,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -1347,6 +1609,18 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -1356,6 +1630,15 @@ "strip-bom": "^4.0.0" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -1430,6 +1713,15 @@ "randombytes": "^2.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -1495,6 +1787,15 @@ "tapable": "^1.0.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -1504,113 +1805,627 @@ "prr": "~1.0.1" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "is-arrayish": "^0.2.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "eslint": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "path-key": { + "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } }, - "semver": { - "version": "5.7.1", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-unicorn": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", + "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^1.1.0", + "eslint-utils": "^2.0.0", + "import-modules": "^2.0.0", + "lodash": "^4.17.15", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.21", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.1.3" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", + "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "multimap": "^1.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true @@ -1798,12 +2613,36 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1841,6 +2680,15 @@ "path-exists": "^4.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "findup-sync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", @@ -1958,6 +2806,34 @@ } } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -2048,7 +2924,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2069,12 +2946,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2089,17 +2968,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2216,7 +3098,8 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2228,6 +3111,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2242,6 +3126,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2249,12 +3134,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.9.0", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2273,6 +3160,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2362,7 +3250,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2374,6 +3263,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2459,7 +3349,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2495,6 +3386,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2514,6 +3406,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2557,15 +3450,29 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -2578,6 +3485,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2695,12 +3608,27 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2803,6 +3731,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "html-escaper": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", @@ -2815,6 +3749,82 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -2827,6 +3837,30 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -2882,6 +3916,12 @@ } } }, + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2954,6 +3994,12 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2969,6 +4015,12 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -2989,6 +4041,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -3041,6 +4099,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3050,12 +4114,42 @@ "isobject": "^3.0.1" } }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3238,12 +4332,24 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", @@ -3253,19 +4359,276 @@ "minimist": "^1.2.0" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lcid": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.13.tgz", + "integrity": "sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.0.3", + "listr2": "^2.6.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", + "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "listr2": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.0.tgz", + "integrity": "sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.2", + "through": "^2.3.8" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "loader-runner": { @@ -3317,6 +4680,129 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3403,6 +4889,12 @@ "readable-stream": "^2.0.1" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -3543,6 +5035,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -3569,6 +5067,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -3629,6 +5133,26 @@ "process-on-spawn": "^1.0.0" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3725,6 +5249,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3734,6 +5270,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3743,6 +5291,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3752,6 +5312,35 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -3849,6 +5438,15 @@ "readable-stream": "^2.1.5" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", @@ -3863,6 +5461,18 @@ "safe-buffer": "^5.1.1" } }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -3911,6 +5521,12 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -3945,12 +5561,27 @@ "find-up": "^4.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3972,6 +5603,12 @@ "fromentries": "^1.2.0" } }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -4068,6 +5705,95 @@ "safe-buffer": "^5.1.0" } }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4215,6 +5941,18 @@ "safe-regex": "^1.1.0" } }, + "regexp-tree": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", + "integrity": "sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==", + "dev": true + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -4254,6 +5992,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, "resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", @@ -4315,6 +6059,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4349,6 +6103,15 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4381,6 +6144,18 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", @@ -4453,6 +6228,50 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -4638,6 +6457,38 @@ "which": "^2.0.1" } }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -4722,6 +6573,12 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -4733,6 +6590,26 @@ "strip-ansi": "^6.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4742,6 +6619,17 @@ "safe-buffer": "~5.1.0" } }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -4763,6 +6651,18 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4772,6 +6672,75 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -4909,6 +6878,18 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -5025,18 +7006,124 @@ } } }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -5327,6 +7414,16 @@ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -5752,6 +7849,18 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -5805,6 +7914,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", @@ -5835,6 +7953,12 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, "yargs": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", diff --git a/package.json b/package.json index fe23add..10e31f6 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", "scripts": { + "lint": "eslint \"spec/**/*.ts\" \"src/**/*.ts\"", "test": "npm run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", "build": "webpack", "preversion": "npm test", @@ -22,8 +23,11 @@ "homepage": "https://github.com/JohnWhiteTB/TypedJSON", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@matthiaskunnen/eslint-config-typescript": "^1.2.0", "@types/jasmine": "^3.5.3", + "husky": "^4.2.5", "jasmine": "^3.5.0", + "lint-staged": "^10.2.13", "nyc": "^15.0.0", "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.16", @@ -35,6 +39,11 @@ "webpack-auto-inject-version": "^1.2.2", "webpack-cli": "^3.3.10" }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, "files": [ "js" ] diff --git a/tsconfig/tsconfig.lint.json b/tsconfig/tsconfig.lint.json new file mode 100644 index 0000000..9849113 --- /dev/null +++ b/tsconfig/tsconfig.lint.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "include": [ + "../spec/**/*.ts", + "../src/**/*.ts" + ] +} From 84ae29e9e319f913db253e1a1140d98eb4f486ce Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 18:51:52 +0000 Subject: [PATCH 014/119] Apply linter autofix --- js/parser.d.ts | 88 +- js/typedjson.d.ts | 18 +- js/typedjson.js | 1321 +++++++++-------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 +- js/typedjson.min.js.map | 2 +- js/typedjson/deserializer.d.ts | 8 +- js/typedjson/helpers.d.ts | 6 +- js/typedjson/json-array-member.d.ts | 4 +- js/typedjson/json-map-member.d.ts | 4 +- js/typedjson/json-member.d.ts | 4 +- js/typedjson/json-object.d.ts | 8 +- js/typedjson/json-set-member.d.ts | 2 +- js/typedjson/metadata.d.ts | 6 +- js/typedjson/serializer.d.ts | 8 +- js/typedjson/type-descriptor.d.ts | 8 +- js/typedjson/types.d.ts | 2 +- spec/array.spec.ts | 88 +- spec/base.spec.ts | 119 +- spec/beforeSerialization.spec.ts | 33 +- spec/custom-deserializer.spec.ts | 44 +- spec/custom-serializer.spec.ts | 51 +- spec/helpers/matchers.ts | 56 +- spec/initializer.spec.ts | 31 +- spec/just-json.spec.ts | 33 +- spec/map.spec.ts | 88 +- spec/onDeserialized.spec.ts | 43 +- spec/parse-to-object.spec.ts | 18 +- spec/polymorphism-abstract-class.spec.ts | 48 +- spec/polymorphism-custom-names.spec.ts | 68 +- spec/polymorphism-custom-type-hints.spec.ts | 121 +- spec/polymorphism-interface.spec.ts | 49 +- spec/polymorphism-nested-arrays.spec.ts | 47 +- spec/polymorphism-root-abstract-class.spec.ts | 23 +- spec/polymorphism.spec.ts | 56 +- spec/preserveNull.spec.ts | 81 +- spec/set.spec.ts | 76 +- spec/to-json.spec.ts | 28 +- spec/utils/everything.ts | 6 +- spec/utils/object-compare.ts | 20 +- src/parser.ts | 369 ++--- src/typedjson.ts | 18 +- src/typedjson/deserializer.ts | 335 ++--- src/typedjson/helpers.ts | 106 +- src/typedjson/json-array-member.ts | 31 +- src/typedjson/json-map-member.ts | 32 +- src/typedjson/json-member.ts | 98 +- src/typedjson/json-object.ts | 57 +- src/typedjson/json-set-member.ts | 28 +- src/typedjson/metadata.ts | 98 +- src/typedjson/options-base.ts | 24 +- src/typedjson/serializer.ts | 212 ++- src/typedjson/to-json.ts | 9 +- src/typedjson/type-descriptor.ts | 24 +- src/typedjson/types.ts | 7 +- 55 files changed, 1924 insertions(+), 2246 deletions(-) diff --git a/js/parser.d.ts b/js/parser.d.ts index 402e78c..d79cff9 100644 --- a/js/parser.d.ts +++ b/js/parser.d.ts @@ -1,8 +1,8 @@ -import { Constructor, IndexedObject, Serializable } from "./typedjson/types"; -import { defaultTypeEmitter } from "./typedjson/serializer"; -import { defaultTypeResolver } from "./typedjson/deserializer"; -import { TypeResolver, TypeHintEmitter } from "./typedjson/metadata"; -import { OptionsBase } from "./typedjson/options-base"; +import { defaultTypeResolver } from './typedjson/deserializer'; +import { TypeHintEmitter, TypeResolver } from './typedjson/metadata'; +import { OptionsBase } from './typedjson/options-base'; +import { defaultTypeEmitter } from './typedjson/serializer'; +import { Constructor, IndexedObject, Serializable } from './typedjson/types'; export declare type JsonTypes = Object | boolean | string | number | null | undefined; export { defaultTypeResolver, defaultTypeEmitter }; export interface ITypedJSONSettings extends OptionsBase { @@ -37,32 +37,32 @@ export interface ITypedJSONSettings extends OptionsBase { } export declare class TypedJSON { static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined; - static parseAsArray(object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1): T[]; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 2): T[][]; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 3): T[][][]; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 4): T[][][][]; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 5): T[][][][][]; + static parseAsArray(object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1): Array; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 2): Array>; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 3): Array>>; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 4): Array>>>; + static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 5): Array>>>>; static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set; static parseAsMap(object: any, keyType: Serializable, valueType: Serializable, settings?: ITypedJSONSettings): Map; static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes; - static toPlainArray(object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): Object[]; - static toPlainArray(object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): Object[][]; - static toPlainArray(object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): Object[][][]; - static toPlainArray(object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): Object[][][][]; - static toPlainArray(object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): Object[][][][][]; - static toPlainArray(object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): any[]; - static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Object[] | undefined; - static toPlainMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): IndexedObject | { + static toPlainArray(object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): Array; + static toPlainArray(object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): Array>; + static toPlainArray(object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): Array>>; + static toPlainArray(object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): Array>>>; + static toPlainArray(object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): Array>>>>; + static toPlainArray(object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): Array; + static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined; + static toPlainMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): IndexedObject | Array<{ key: any; value: any; - }[] | undefined; + }> | undefined; static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): string; + static stringifyAsArray(object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): string; static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string; static stringifyAsMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): string; private static _globalConfig; @@ -94,12 +94,12 @@ export declare class TypedJSON { * @returns Deserialized T or undefined if there were errors. */ parse(object: any): T | undefined; - parseAsArray(object: any, dimensions?: 1): T[]; - parseAsArray(object: any, dimensions: 2): T[][]; - parseAsArray(object: any, dimensions: 3): T[][][]; - parseAsArray(object: any, dimensions: 4): T[][][][]; - parseAsArray(object: any, dimensions: 5): T[][][][][]; - parseAsArray(object: any, dimensions: number): any[]; + parseAsArray(object: any, dimensions?: 1): Array; + parseAsArray(object: any, dimensions: 2): Array>; + parseAsArray(object: any, dimensions: 3): Array>>; + parseAsArray(object: any, dimensions: 4): Array>>>; + parseAsArray(object: any, dimensions: 5): Array>>>>; + parseAsArray(object: any, dimensions: number): Array; parseAsSet(object: any): Set; parseAsMap(object: any, keyConstructor: Serializable): Map; /** @@ -108,16 +108,16 @@ export declare class TypedJSON { * @returns Serialized object or undefined if an error has occured. */ toPlainJson(object: T): JsonTypes; - toPlainArray(object: T[], dimensions?: 1): Object[]; - toPlainArray(object: T[][], dimensions: 2): Object[][]; - toPlainArray(object: T[][][], dimensions: 3): Object[][][]; - toPlainArray(object: T[][][][], dimensions: 4): Object[][][][]; - toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][]; - toPlainSet(object: Set): Object[] | undefined; - toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | { + toPlainArray(object: Array, dimensions?: 1): Array; + toPlainArray(object: Array>, dimensions: 2): Array>; + toPlainArray(object: Array>>, dimensions: 3): Array>>; + toPlainArray(object: Array>>>, dimensions: 4): Array>>>; + toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>; + toPlainSet(object: Set): Array | undefined; + toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any; - }[] | undefined; + }> | undefined; /** * Converts an instance of the specified class type to a JSON string. * @param object The instance to convert to a JSON string. @@ -126,11 +126,11 @@ export declare class TypedJSON { * the errorHandler did not throw. */ stringify(object: T): string; - stringifyAsArray(object: T[], dimensions?: 1): string; - stringifyAsArray(object: T[][], dimensions: 2): string; - stringifyAsArray(object: T[][][], dimensions: 3): string; - stringifyAsArray(object: T[][][][], dimensions: 4): string; - stringifyAsArray(object: T[][][][][], dimensions: 5): string; + stringifyAsArray(object: Array, dimensions?: 1): string; + stringifyAsArray(object: Array>, dimensions: 2): string; + stringifyAsArray(object: Array>>, dimensions: 3): string; + stringifyAsArray(object: Array>>>, dimensions: 4): string; + stringifyAsArray(object: Array>>>>, dimensions: 5): string; stringifyAsSet(object: Set): string; stringifyAsMap(object: Map, keyConstructor: Serializable): string; private _mapKnownTypes; diff --git a/js/typedjson.d.ts b/js/typedjson.d.ts index 7474d41..77e9ff2 100644 --- a/js/typedjson.d.ts +++ b/js/typedjson.d.ts @@ -1,9 +1,9 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from "./parser"; -export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from "./typedjson/metadata"; -export { jsonObject } from "./typedjson/json-object"; -export { jsonMember } from "./typedjson/json-member"; -export { jsonArrayMember } from "./typedjson/json-array-member"; -export { jsonSetMember } from "./typedjson/json-set-member"; -export { jsonMapMember } from "./typedjson/json-map-member"; -export { toJson } from "./typedjson/to-json"; -export { ArrayT, SetT, MapT } from "./typedjson/type-descriptor"; +export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from './parser'; +export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from './typedjson/metadata'; +export { jsonObject } from './typedjson/json-object'; +export { jsonMember } from './typedjson/json-member'; +export { jsonArrayMember } from './typedjson/json-array-member'; +export { jsonSetMember } from './typedjson/json-set-member'; +export { jsonMapMember } from './typedjson/json-map-member'; +export { toJson } from './typedjson/to-json'; +export { ArrayT, SetT, MapT } from './typedjson/type-descriptor'; diff --git a/js/typedjson.js b/js/typedjson.js index becd255..a7753af 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-07-27 +// [typedjson] Version: 1.6.0-rc2 - 2020-08-26 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -110,25 +110,25 @@ var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { r[k] = a[j]; return r; }; -var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + - ' and "emitDecoratorMetadata" in your tsconfig.json?'; +var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + + ' and "emitDecoratorMetadata" in your tsconfig.json?'; /** * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. * Values of these types don't need special conversion. * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`). */ function isDirectlySerializableNativeType(type) { - return !!(~[Date, Number, String, Boolean].indexOf(type)); + return Boolean(~[Date, Number, String, Boolean].indexOf(type)); } function isDirectlyDeserializableNativeType(type) { - return !!(~[Number, String, Boolean].indexOf(type)); + return Boolean(~[Number, String, Boolean].indexOf(type)); } function isTypeTypedArray(type) { - return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] + return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] .indexOf(type)); } function isObject(value) { - return typeof value === "object"; + return typeof value === 'object'; } function shouldOmitParseString(jsonStr, expectedType) { var expectsTypesSerializedAsStrings = expectedType === String @@ -157,10 +157,10 @@ function logError(message) { for (var _i = 1; _i < arguments.length; _i++) { optionalParams[_i - 1] = arguments[_i]; } - if (typeof console === "object" && typeof console.error === "function") { + if (typeof console === 'object' && typeof console.error === 'function') { console.error.apply(console, __spreadArrays([message], optionalParams)); } - else if (typeof console === "object" && typeof console.log === "function") { + else if (typeof console === 'object' && typeof console.log === 'function') { console.log.apply(console, __spreadArrays(["ERROR: " + message], optionalParams)); } } @@ -169,7 +169,7 @@ function logMessage(message) { for (var _i = 1; _i < arguments.length; _i++) { optionalParams[_i - 1] = arguments[_i]; } - if (typeof console === "object" && typeof console.log === "function") { + if (typeof console === 'object' && typeof console.log === 'function') { console.log.apply(console, __spreadArrays([message], optionalParams)); } } @@ -178,10 +178,10 @@ function logWarning(message) { for (var _i = 1; _i < arguments.length; _i++) { optionalParams[_i - 1] = arguments[_i]; } - if (typeof console === "object" && typeof console.warn === "function") { + if (typeof console === 'object' && typeof console.warn === 'function') { console.warn.apply(console, __spreadArrays([message], optionalParams)); } - else if (typeof console === "object" && typeof console.log === "function") { + else if (typeof console === 'object' && typeof console.log === 'function') { console.log.apply(console, __spreadArrays(["WARNING: " + message], optionalParams)); } } @@ -190,33 +190,33 @@ function logWarning(message) { * @param value */ function isValueDefined(value) { - return !(typeof value === "undefined" || value === null); + return !(typeof value === 'undefined' || value === null); } function isInstanceOf(value, constructor) { - if (typeof value === "number") { - return (constructor === Number); + if (typeof value === 'number') { + return constructor === Number; } - else if (typeof value === "string") { - return (constructor === String); + else if (typeof value === 'string') { + return constructor === String; } - else if (typeof value === "boolean") { - return (constructor === Boolean); + else if (typeof value === 'boolean') { + return constructor === Boolean; } else if (isObject(value)) { - return (value instanceof constructor); + return value instanceof constructor; } return false; } -var isReflectMetadataSupported = (typeof Reflect === "object" && typeof Reflect.getMetadata === "function"); +var isReflectMetadataSupported = typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; /** * Gets the name of a function. * @param fn The function whose name to get. */ function nameof(fn) { - if (typeof fn.name === "string") { + if (typeof fn.name === 'string') { return fn.name; } - return "undefined"; + return 'undefined'; } function identity(arg) { return arg; @@ -224,9 +224,9 @@ function identity(arg) { // CONCATENATED MODULE: ./src/typedjson/metadata.ts -var METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; +var METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; var metadata_JsonObjectMetadata = /** @class */ (function () { - //#endregion + // #endregion function JsonObjectMetadata(classType) { this.dataMembers = new Map(); /** Set of known types used for polymorphic deserialization */ @@ -243,7 +243,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { this.isHandledWithoutAnnotation = false; this.classType = classType; } - //#region Static + // #region Static /** * Gets the name of a class as it appears in a serialized JSON string. * @param ctor The constructor of a class (with or without jsonObject). @@ -288,9 +288,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { var parentMetadata = prototype[METADATA_FIELD_KEY]; if (parentMetadata) { parentMetadata.dataMembers - .forEach(function (memberMetadata, propKey) { - return objectMetadata.dataMembers.set(propKey, memberMetadata); - }); + .forEach(function (memberMetadata, propKey) { return objectMetadata.dataMembers.set(propKey, memberMetadata); }); parentMetadata.knownTypes .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); objectMetadata.typeResolver = parentMetadata.typeResolver; @@ -300,7 +298,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { enumerable: false, configurable: false, writable: false, - value: objectMetadata + value: objectMetadata, }); return objectMetadata; }; @@ -324,13 +322,13 @@ function injectMetadataInformation(prototype, propKey, metadata) { // When a property decorator is applied to a static member, 'constructor' is a constructor function. // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. - if (typeof prototype === "function") { + if (typeof prototype === 'function') { logError(decoratorName + ": cannot use a static property."); return; } // Methods cannot be serialized. // @ts-ignore symbol indexing is not supported by ts - if (typeof prototype[propKey] === "function") { + if (typeof prototype[propKey] === 'function') { logError(decoratorName + ": cannot use a method property."); return; } @@ -352,6 +350,17 @@ function injectMetadataInformation(prototype, propKey, metadata) { } // CONCATENATED MODULE: ./src/typedjson/options-base.ts +var __assign = (undefined && undefined.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; var kAllOptions = [ 'preserveNull', ]; @@ -366,21 +375,22 @@ function extractOptionBase(from) { } function getDefaultOptionOf(key) { switch (key) { - case "preserveNull": + case 'preserveNull': return false; } // never reached return null; } function getOptionValue(key, options) { - if (options && options[key] != null) + if (options && options[key] != null) { return options[key]; + } return getDefaultOptionOf(key); } function mergeOptions(existing, moreSpecific) { return !moreSpecific ? existing - : Object.assign({}, existing, moreSpecific); + : __assign(__assign({}, existing), moreSpecific); } // CONCATENATED MODULE: ./src/typedjson/type-descriptor.ts @@ -494,470 +504,159 @@ function MapT(keyType, valueType, options) { // return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); // } function isTypelike(type) { - return type && (typeof type === "function" || type instanceof TypeDescriptor); + return type && (typeof type === 'function' || type instanceof TypeDescriptor); } function ensureTypeDescriptor(type) { return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); } -// CONCATENATED MODULE: ./src/typedjson/serializer.ts -var __assign = (undefined && undefined.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; +// CONCATENATED MODULE: ./src/typedjson/deserializer.ts -function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { - // 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 will know what to deserialize into (given - // the required known-types are defined, and the object is a valid subtype of the expected type). - if (sourceObject.constructor !== expectedSourceType) { - targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name - ? sourceTypeMetadata.name - : nameof(sourceObject.constructor); +function defaultTypeResolver(sourceObject, knownTypes) { + if (sourceObject.__type) { + return knownTypes.get(sourceObject.__type); } } /** - * 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 called "simple javascript object"), - * and emits any necessary type hints in the process (for polymorphism). - * - * 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: - * - * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string + * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. + * It is used after parsing a JSON-string. */ -var serializer_Serializer = /** @class */ (function () { - function Serializer() { - this.typeHintEmitter = defaultTypeEmitter; +var deserializer_Deserializer = /** @class */ (function () { + function Deserializer() { + this.typeResolver = defaultTypeResolver; this.errorHandler = logError; - this.serializationStrategy = new Map([ + this.deserializationStrategy = new Map([ // primitives - [Date, identity], - [Number, identity], - [String, identity], - [Boolean, identity], - [ArrayBuffer, convertAsArrayBuffer], - [DataView, convertAsDataView], + [Number, deserializeDirectly], + [String, deserializeDirectly], + [Boolean, deserializeDirectly], + [Date, deserializeDate], + [ArrayBuffer, stringToArrayBuffer], + [DataView, stringToDataView], [Array, convertAsArray], [Set, convertAsSet], [Map, convertAsMap], // typed arrays - [Float32Array, convertAsTypedArray], - [Float64Array, convertAsTypedArray], - [Int8Array, convertAsTypedArray], - [Uint8Array, convertAsTypedArray], - [Uint8ClampedArray, convertAsTypedArray], - [Int16Array, convertAsTypedArray], - [Uint16Array, convertAsTypedArray], - [Int32Array, convertAsTypedArray], - [Uint32Array, convertAsTypedArray], + [Float32Array, convertAsFloatArray], + [Float64Array, convertAsFloatArray], + [Uint8Array, convertAsUintArray], + [Uint8ClampedArray, convertAsUintArray], + [Uint16Array, convertAsUintArray], + [Uint32Array, convertAsUintArray], ]); } - Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { - if (typeof typeEmitterCallback !== "function") { - throw new TypeError("'typeEmitterCallback' is not a function."); + Deserializer.prototype.setNameResolver = function (nameResolverCallback) { + this.nameResolver = nameResolverCallback; + }; + Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { + if (typeof typeResolverCallback !== 'function') { + throw new TypeError('\'typeResolverCallback\' is not a function.'); } - this.typeHintEmitter = typeEmitterCallback; + this.typeResolver = typeResolverCallback; }; - Serializer.prototype.getTypeHintEmitter = function () { - return this.typeHintEmitter; + Deserializer.prototype.getTypeResolver = function () { + return this.typeResolver; }; - Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== "function") { - throw new TypeError("'errorHandlerCallback' is not a function."); + Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); } this.errorHandler = errorHandlerCallback; }; - Serializer.prototype.getErrorHandler = function () { + Deserializer.prototype.getErrorHandler = function () { return this.errorHandler; }; - Serializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - /** - * Convert a value of any supported serializable type. - * The value type will be detected, and the correct serialization method will be called. - */ - Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { - if (memberName === void 0) { memberName = "object"; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) + Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { + if (memberName === void 0) { memberName = 'object'; } + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { return null; - if (!isValueDefined(sourceObject)) - return; - if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { - var expectedName = nameof(typeDescriptor.ctor); - var actualName = nameof(sourceObject.constructor); - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); + } + else if (!isValueDefined(sourceObject)) { return; } - var serializer = this.serializationStrategy.get(typeDescriptor.ctor); - if (serializer) { - return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); + var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); + if (deserializer) { + return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); } - // if not present in the strategy do property by property serialization - if (typeof sourceObject === "object") { - return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); + if (typeof sourceObject === 'object') { + return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); } - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); + this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); }; - return Serializer; -}()); - -/** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ -function convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - var sourceTypeMetadata; - var targetObject; - var typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { - // The source object is not of the expected type, but it is a valid subtype. - // This is OK, and we'll proceed to gather object metadata from the subtype instead. - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else { - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); - } - if (sourceTypeMetadata) { - if (sourceTypeMetadata.beforeSerializationMethodName) { - // check for member first - if (typeof sourceObject[sourceTypeMetadata.beforeSerializationMethodName] === "function") { - sourceObject[sourceTypeMetadata.beforeSerializationMethodName](); - } - // check for static - else if (typeof sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName] === "function") { - sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName](); - } - else { - serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + nameof(sourceTypeMetadata.classType) + "." + sourceTypeMetadata.beforeSerializationMethodName + "' is not a method.")); - } - } - var sourceMeta_1 = sourceTypeMetadata; - // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), - // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', - // which is what will be put into 'JSON.stringify' finally. - targetObject = {}; - var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); - if (sourceMeta_1.typeHintEmitter) { - typeHintEmitter = sourceMeta_1.typeHintEmitter; + Deserializer.prototype.instantiateType = function (ctor) { + return new ctor(); + }; + Deserializer.prototype.mergeKnownTypes = function () { + var _this = this; + var knownTypeMaps = []; + for (var _i = 0; _i < arguments.length; _i++) { + knownTypeMaps[_i] = arguments[_i]; } - sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var serialized; - if (objMemberMetadata.serializer) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } - else if (objMemberMetadata.type) { - serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + var result = new Map(); + knownTypeMaps.forEach(function (knownTypes) { + knownTypes.forEach(function (ctor, name) { + if (_this.nameResolver) { + result.set(_this.nameResolver(ctor), ctor); + } + else { + result.set(name, ctor); + } + }); + }); + return result; + }; + Deserializer.prototype.createKnownTypesMap = function (knowTypes) { + var _this = this; + var map = new Map(); + knowTypes.forEach(function (ctor) { + if (_this.nameResolver) { + map.set(_this.nameResolver(ctor), ctor); } else { - throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" - + " no constructor nor serialization function to use."); - } - if (isValueDefined(serialized) - || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)) { - targetObject[objMemberMetadata.name] = serialized; + var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); + var name_1 = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name + ? knownTypeMeta.name + : ctor.name; + map.set(name_1, ctor); } }); - } - else { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = __assign({}, sourceObject); - } - // Add type-hint. - typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - return targetObject; + return map; + }; + Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); + }; + Deserializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + }; + return Deserializer; +}()); + +function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { + throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" + + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); } -/** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects - * (or primitive values) for serialization. - */ -function convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); +function makeTypeErrorMessage(expectedType, actualType, memberName) { + var expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType; + var actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; + return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "', got '" + actualTypeName + "'."; +} +function srcTypeNameForDebug(sourceObject) { + return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; +} +function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { + if (sourceObject.constructor !== typeDescriptor.ctor) { + throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); } - if (!typeDescriptor.elementType) { - throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); - } - // Check the type of each element, individually. - // If at least one array element type is incorrect, we return undefined, which results in no - // value emitted during serialization. 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 - // the emitted array. - sourceObject.forEach(function (element, i) { - if (!(serializer.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { - var expectedTypeName = nameof(typeDescriptor.elementType.ctor); - var actualTypeName = element && nameof(element.constructor); - throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + - (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); - } - }); - if (memberName) { - // Just for debugging purposes. - memberName += "[]"; - } - return sourceObject.map(function (element) { return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); -} -/** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * @returns - */ -function convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); - } - if (!typeDescriptor.elementType) { - throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); - } - // For debugging and error tracking. - if (memberName) { - memberName += "[]"; - } - var resultArray = []; - // Convert each element of the set, and put it into an output array. - // The output array is the one serialized, as JSON.stringify does not support Set serialization. - // (TODO: clarification needed) - sourceObject.forEach(function (element) { - var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became undefined - // DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) { - resultArray.push(resultElement); - } - }); - return resultArray; -} -/** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - */ -function convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); - } - if (!typeDescriptor.valueType) { - throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); - } - if (!typeDescriptor.keyType) { - throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); - } - if (memberName) { - memberName += "[]"; - } - // const resultArray: Array<{ key: any, value: any }> = []; - var resultShape = typeDescriptor.getCompleteOptions().shape; - var result = resultShape === 1 /* OBJECT */ ? {} : []; - var preserveNull = serializer.retrievePreserveNull(memberOptions); - // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach(function (value, key) { - var resultKeyValuePairObj = { - key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), - }; - // We are not going to emit entries with undefined keys OR undefined values. - var keyDefined = isValueDefined(resultKeyValuePairObj.key); - var valueDefined = isValueDefined(resultKeyValuePairObj.value) - || (resultKeyValuePairObj.value === null && preserveNull); - if (keyDefined && valueDefined) { - if (resultShape === 1 /* OBJECT */) { - result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; - } - else { - result.push(resultKeyValuePairObj); - } - } - }); - return result; -} -/** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - */ -function convertAsTypedArray(sourceObject) { - return Array.from(sourceObject); -} -/** - * Performs the conversion of a raw ArrayBuffer to a string. - */ -function convertAsArrayBuffer(buffer) { - // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(function (charCode) { return String.fromCharCode(charCode); }).join(""); -} -/** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ -function convertAsDataView(dataView) { - return convertAsArrayBuffer(dataView.buffer); -} - -// CONCATENATED MODULE: ./src/typedjson/deserializer.ts - - - - -function defaultTypeResolver(sourceObject, knownTypes) { - if (sourceObject.__type) - return knownTypes.get(sourceObject.__type); -} -/** - * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. - * It is used after parsing a JSON-string. - */ -var deserializer_Deserializer = /** @class */ (function () { - function Deserializer() { - this.typeResolver = defaultTypeResolver; - this.errorHandler = logError; - this.deserializationStrategy = new Map([ - // primitives - [Number, deserializeDirectly], - [String, deserializeDirectly], - [Boolean, deserializeDirectly], - [Date, deserializeDate], - [ArrayBuffer, stringToArrayBuffer], - [DataView, stringToDataView], - [Array, deserializer_convertAsArray], - [Set, deserializer_convertAsSet], - [Map, deserializer_convertAsMap], - // typed arrays - [Float32Array, convertAsFloatArray], - [Float64Array, convertAsFloatArray], - [Uint8Array, convertAsUintArray], - [Uint8ClampedArray, convertAsUintArray], - [Uint16Array, convertAsUintArray], - [Uint32Array, convertAsUintArray], - ]); - } - Deserializer.prototype.setNameResolver = function (nameResolverCallback) { - this.nameResolver = nameResolverCallback; - }; - Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { - if (typeof typeResolverCallback !== "function") { - throw new TypeError("'typeResolverCallback' is not a function."); - } - this.typeResolver = typeResolverCallback; - }; - Deserializer.prototype.getTypeResolver = function () { - return this.typeResolver; - }; - Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== "function") { - throw new TypeError("'errorHandlerCallback' is not a function."); - } - this.errorHandler = errorHandlerCallback; - }; - Deserializer.prototype.getErrorHandler = function () { - return this.errorHandler; - }; - Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - if (memberName === void 0) { memberName = "object"; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - return null; - } - else if (!isValueDefined(sourceObject)) { - return; - } - var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer) { - return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); - } - if (typeof sourceObject === "object") { - return deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); - } - this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); - }; - Deserializer.prototype.instantiateType = function (ctor) { - return new ctor(); - }; - Deserializer.prototype.mergeKnownTypes = function () { - var _this = this; - var knownTypeMaps = []; - for (var _i = 0; _i < arguments.length; _i++) { - knownTypeMaps[_i] = arguments[_i]; - } - var result = new Map(); - knownTypeMaps.forEach(function (knownTypes) { - knownTypes.forEach(function (ctor, name) { - if (_this.nameResolver) { - result.set(_this.nameResolver(ctor), ctor); - } - else { - result.set(name, ctor); - } - }); - }); - return result; - }; - Deserializer.prototype.createKnownTypesMap = function (knowTypes) { - var _this = this; - var map = new Map(); - knowTypes.forEach(function (ctor) { - if (_this.nameResolver) { - map.set(_this.nameResolver(ctor), ctor); - } - else { - var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); - var name_1 = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name - ? knownTypeMeta.name - : ctor.name; - map.set(name_1, ctor); - } - }); - return map; - }; - Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === "object"); - }; - Deserializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - return Deserializer; -}()); - -function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { - throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" - + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); -} -function makeTypeErrorMessage(expectedType, actualType, memberName) { - var expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; - var actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; - return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "', got '" + actualTypeName + "'."; -} -function srcTypeNameForDebug(sourceObject) { - return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; -} -function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { - if (sourceObject.constructor !== typeDescriptor.ctor) { - throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); - } - return sourceObject; -} -function deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { - if (typeof sourceObject !== "object" || sourceObject === null) { - deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); - return undefined; + return sourceObject; +} +function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { + if (typeof sourceObject !== 'object' || sourceObject === null) { + deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); + return undefined; } var expectedSelfType = typeDescriptor.ctor; var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); @@ -1016,7 +715,7 @@ function deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, }); // Next, instantiate target object. var targetObject = void 0; - if (typeof sourceObjectMetadata.initializerCallback === "function") { + if (typeof sourceObjectMetadata.initializerCallback === 'function') { try { targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); // Check the validity of user-defined initializer callback. @@ -1046,11 +745,11 @@ function deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, // Call onDeserialized method (if any). if (sourceObjectMetadata.onDeserializedMethodName) { // check for member first - if (typeof targetObject[sourceObjectMetadata.onDeserializedMethodName] === "function") { + if (typeof targetObject[sourceObjectMetadata.onDeserializedMethodName] === 'function') { targetObject[sourceObjectMetadata.onDeserializedMethodName](); } // check for static - else if (typeof targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName] === "function") { + else if (typeof targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName] === 'function') { targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName](); } else { @@ -1068,210 +767,524 @@ function deserializer_convertAsObject(sourceObject, typeDescriptor, knownTypes, return targetObject_1; } } -function deserializer_convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { +function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!Array.isArray(sourceObject)) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return []; + } + if (!typeDescriptor.elementType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); + return []; + } + return sourceObject.map(function (element) { + // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty + // entries, as an Array is ordered. + try { + return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); + } + catch (e) { + deserializer.getErrorHandler()(e); + // Keep filling the array here with undefined to keep original ordering. + // Note: this is just aesthetics, not returning anything produces the same result. + return undefined; + } + }); +} +function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + if (!Array.isArray(sourceObject)) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return new Set(); + } + if (!typeDescriptor.elementType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); + return new Set(); + } + var resultSet = new Set(); + sourceObject.forEach(function (element, i) { + try { + resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); + } + catch (e) { + // Faulty entries are skipped, because a Set is not ordered, and skipping an entry + // does not affect others. + deserializer.getErrorHandler()(e); + } + }); + return resultSet; +} +function isExpectedMapShape(source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); +} +function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" + + ' proper annotation or function for this type'); + } + var expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!isExpectedMapShape(sourceObject, expectedShape)) { + var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); + return new Map(); + } + if (!typeDescriptor.keyType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); + return new Map(); + } + if (!typeDescriptor.valueType) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); + return new Map(); + } + var resultMap = new Map(); + if (expectedShape === 1 /* OBJECT */) { + Object.keys(sourceObject).forEach(function (key) { + try { + var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + if (isValueDefined(resultKey)) { + resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + else { + sourceObject.forEach(function (element) { + try { + var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) { + resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + return resultMap; +} +function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). + // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime + if (typeof sourceObject === 'string' || (typeof sourceObject === 'number' && sourceObject > 0)) { + return new Date(sourceObject); + } + else if (sourceObject instanceof Date) { + return sourceObject; + } + else { + throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); + } +} +function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + } + return createArrayBufferFromString(sourceObject); +} +function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + } + return new DataView(createArrayBufferFromString(sourceObject)); +} +function createArrayBufferFromString(input) { + var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char + var bufView = new Uint16Array(buf); + for (var i = 0, strLen = input.length; i < strLen; i++) { + bufView[i] = input.charCodeAt(i); + } + return buf; +} +function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + return new constructor(sourceObject); + } + return throwTypeMismatchError(constructor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); +} +function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + return new constructor(sourceObject.map(function (value) { return ~~value; })); + } + return throwTypeMismatchError(typeDescriptor.ctor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); +} + +// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts + + + + +/** + * Specifies that a property, of type array, is part of an object when serializing. + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). + * @param options Additional options. + */ +function jsonArrayMember(elementConstructor, options) { + if (options === void 0) { options = {}; } + return function (target, propKey) { + var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. + if (!isTypelike(elementConstructor)) { + logError(decoratorName + ": could not resolve constructor of array elements at runtime."); + return; + } + var dimensions = options.dimensions === undefined ? 1 : options.dimensions; + if (!isNaN(dimensions) && dimensions < 1) { + logError(decoratorName + ": 'dimensions' option must be at least 1."); + return; + } + // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Array) { + logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); + return; + } + injectMetadataInformation(target, propKey, { + type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: propKey.toString(), + name: options.name || propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; +} +function createArrayType(elementType, dimensions) { + var type = new ArrayTypeDescriptor(elementType); + for (var i = 1; i < dimensions; ++i) { + type = new ArrayTypeDescriptor(type); + } + return type; +} + +// CONCATENATED MODULE: ./src/typedjson/serializer.ts +var serializer_assign = (undefined && undefined.__assign) || function () { + serializer_assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return serializer_assign.apply(this, arguments); +}; + + + + +function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { + // 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 will know what to deserialize into (given + // the required known-types are defined, and the object is a valid subtype of the expected type). + if (sourceObject.constructor !== expectedSourceType) { + targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name + ? sourceTypeMetadata.name + : nameof(sourceObject.constructor); + } +} +/** + * 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 called "simple javascript object"), + * and emits any necessary type hints in the process (for polymorphism). + * + * 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: + * + * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string + */ +var serializer_Serializer = /** @class */ (function () { + function Serializer() { + this.typeHintEmitter = defaultTypeEmitter; + this.errorHandler = logError; + this.serializationStrategy = new Map([ + // primitives + [Date, identity], + [Number, identity], + [String, identity], + [Boolean, identity], + [ArrayBuffer, convertAsArrayBuffer], + [DataView, convertAsDataView], + [Array, serializer_convertAsArray], + [Set, serializer_convertAsSet], + [Map, serializer_convertAsMap], + // typed arrays + [Float32Array, convertAsTypedArray], + [Float64Array, convertAsTypedArray], + [Int8Array, convertAsTypedArray], + [Uint8Array, convertAsTypedArray], + [Uint8ClampedArray, convertAsTypedArray], + [Int16Array, convertAsTypedArray], + [Uint16Array, convertAsTypedArray], + [Int32Array, convertAsTypedArray], + [Uint32Array, convertAsTypedArray], + ]); + } + Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { + if (typeof typeEmitterCallback !== 'function') { + throw new TypeError('\'typeEmitterCallback\' is not a function.'); + } + this.typeHintEmitter = typeEmitterCallback; + }; + Serializer.prototype.getTypeHintEmitter = function () { + return this.typeHintEmitter; + }; + Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); + } + this.errorHandler = errorHandlerCallback; + }; + Serializer.prototype.getErrorHandler = function () { + return this.errorHandler; + }; + Serializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + }; + /** + * Convert a value of any supported serializable type. + * The value type will be detected, and the correct serialization method will be called. + */ + Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { + if (memberName === void 0) { memberName = 'object'; } + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { + return null; + } + if (!isValueDefined(sourceObject)) { + return; + } + if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { + var expectedName = nameof(typeDescriptor.ctor); + var actualName = nameof(sourceObject.constructor); + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); + return; + } + var serializer = this.serializationStrategy.get(typeDescriptor.ctor); + if (serializer) { + return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); + } + // if not present in the strategy do property by property serialization + if (typeof sourceObject === 'object') { + return serializer_convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); + } + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); + }; + return Serializer; +}()); + +/** + * Performs the conversion of a typed object (usually a class instance) to a simple + * javascript object for serialization. + */ +function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + var sourceTypeMetadata; + var targetObject; + var typeHintEmitter = serializer.getTypeHintEmitter(); + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { + // The source object is not of the expected type, but it is a valid subtype. + // This is OK, and we'll proceed to gather object metadata from the subtype instead. + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); + } + else { + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); + } + if (sourceTypeMetadata) { + if (sourceTypeMetadata.beforeSerializationMethodName) { + // check for member first + if (typeof sourceObject[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { + sourceObject[sourceTypeMetadata.beforeSerializationMethodName](); + } + // check for static + else if (typeof sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { + sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName](); + } + else { + serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + nameof(sourceTypeMetadata.classType) + "." + sourceTypeMetadata.beforeSerializationMethodName + "' is not a method.")); + } + } + var sourceMeta_1 = sourceTypeMetadata; + // Strong-typed serialization available. + // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), + // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', + // which is what will be put into 'JSON.stringify' finally. + targetObject = {}; + var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); + if (sourceMeta_1.typeHintEmitter) { + typeHintEmitter = sourceMeta_1.typeHintEmitter; + } + sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { + var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); + var serialized; + if (objMemberMetadata.serializer) { + serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); + } + else if (objMemberMetadata.type) { + serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + } + else { + throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" + + " no constructor nor serialization function to use."); + } + if (isValueDefined(serialized) + || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)) { + targetObject[objMemberMetadata.name] = serialized; + } + }); + } + else { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = serializer_assign({}, sourceObject); + } + // Add type-hint. + typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); + return targetObject; +} +/** + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects + * (or primitive values) for serialization. + */ +function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" + throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" + ' proper annotation or function for this type'); } - if (!(Array.isArray(sourceObject))) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return []; - } if (!typeDescriptor.elementType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); - return []; + throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); } - return sourceObject.map(function (element) { - // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty - // entries, as an Array is ordered. - try { - return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); - } - catch (e) { - deserializer.getErrorHandler()(e); - // Keep filling the array here with undefined to keep original ordering. - // Note: this is just aesthetics, not returning anything produces the same result. - return undefined; + // Check the type of each element, individually. + // If at least one array element type is incorrect, we return undefined, which results in no + // value emitted during serialization. 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 + // the emitted array. + sourceObject.forEach(function (element, i) { + if (!(serializer.retrievePreserveNull(memberOptions) && element === null) + && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { + var expectedTypeName = nameof(typeDescriptor.elementType.ctor); + var actualTypeName = element && nameof(element.constructor); + throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); } }); + if (memberName) { + // Just for debugging purposes. + memberName += '[]'; + } + return sourceObject.map(function (element) { return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); } -function deserializer_convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { +/** + * Performs the conversion of a set of typed objects (or primitive values) into an array + * of simple javascript objects. + * @returns + */ +function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" + throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" + ' proper annotation or function for this type'); } - if (!(Array.isArray(sourceObject))) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return new Set(); - } if (!typeDescriptor.elementType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); - return new Set(); + throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); } - var resultSet = new Set(); - sourceObject.forEach(function (element, i) { - try { - resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); - } - catch (e) { - // Faulty entries are skipped, because a Set is not ordered, and skipping an entry - // does not affect others. - deserializer.getErrorHandler()(e); + // For debugging and error tracking. + if (memberName) { + memberName += '[]'; + } + var resultArray = []; + // Convert each element of the set, and put it into an output array. + // The output array is the one serialized, as JSON.stringify does not support Set serialization. + // (TODO: clarification needed) + sourceObject.forEach(function (element) { + var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + // Add to output if the source element was undefined, OR the converted element is defined. + // This will add intentionally undefined values to output, but not values that became undefined + // DURING serializing (usually because of a type-error). + if (!isValueDefined(element) || isValueDefined(resultElement)) { + resultArray.push(resultElement); } }); - return resultSet; -} -function isExpectedMapShape(source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === "object"); + return resultArray; } -function deserializer_convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { +/** + * Performs the conversion of a map of typed objects (or primitive values) into an array + * of simple javascript objects with `key` and `value` properties. + */ +function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" + throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" + ' proper annotation or function for this type'); } - var expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!isExpectedMapShape(sourceObject, expectedShape)) { - var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); - return new Map(); + if (!typeDescriptor.valueType) { + throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); } if (!typeDescriptor.keyType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); - return new Map(); - } - if (!typeDescriptor.valueType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); - return new Map(); + throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); } - var resultMap = new Map(); - if (expectedShape === 1 /* OBJECT */) { - Object.keys(sourceObject).forEach(function (key) { - try { - var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - if (isValueDefined(resultKey)) { - resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); - } - }); + if (memberName) { + memberName += '[]'; } - else { - sourceObject.forEach(function (element) { - try { - var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) { - resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); - } + // const resultArray: Array<{ key: any, value: any }> = []; + var resultShape = typeDescriptor.getCompleteOptions().shape; + var result = resultShape === 1 /* OBJECT */ ? {} : []; + var preserveNull = serializer.retrievePreserveNull(memberOptions); + // Convert each *entry* in the map to a simple javascript object with key and value properties. + sourceObject.forEach(function (value, key) { + var resultKeyValuePairObj = { + key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + }; + // We are not going to emit entries with undefined keys OR undefined values. + var keyDefined = isValueDefined(resultKeyValuePairObj.key); + var valueDefined = isValueDefined(resultKeyValuePairObj.value) + || (resultKeyValuePairObj.value === null && preserveNull); + if (keyDefined && valueDefined) { + if (resultShape === 1 /* OBJECT */) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); + else { + result.push(resultKeyValuePairObj); } - }); - } - return resultMap; -} -function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). - // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) { - return new Date(sourceObject); - } - else if (sourceObject instanceof Date) { - return sourceObject; - } - else { - throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug(sourceObject), memberName); - } -} -function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== "string") { - throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug(sourceObject), memberName); - } - return createArrayBufferFromString(sourceObject); -} -function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== "string") { - throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug(sourceObject), memberName); - } - return new DataView(createArrayBufferFromString(sourceObject)); -} -function createArrayBufferFromString(input) { - var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char - var bufView = new Uint16Array(buf); - for (var i = 0, strLen = input.length; i < strLen; i++) { - bufView[i] = input.charCodeAt(i); - } - return buf; -} -function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - return new constructor(sourceObject); - } - return throwTypeMismatchError(constructor.name, "a numeric source array", srcTypeNameForDebug(sourceObject), memberName); + } + }); + return result; } -function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - return new constructor(sourceObject.map(function (value) { return ~~value; })); - } - return throwTypeMismatchError(typeDescriptor.ctor.name, "a numeric source array", srcTypeNameForDebug(sourceObject), memberName); +/** + * Performs the conversion of a typed javascript array to a simple untyped javascript array. + * This is needed because typed arrays are otherwise serialized as objects, so we'll end up + * with something like "{ 0: 0, 1: 1, ... }". + */ +function convertAsTypedArray(sourceObject) { + return Array.from(sourceObject); } - -// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts - - - - /** - * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). - * @param options Additional options. + * Performs the conversion of a raw ArrayBuffer to a string. */ -function jsonArrayMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. - if (!isTypelike(elementConstructor)) { - logError(decoratorName + ": could not resolve constructor of array elements at runtime."); - return; - } - var dimensions = options.dimensions === undefined ? 1 : options.dimensions; - if (!isNaN(dimensions) && dimensions < 1) { - logError(decoratorName + ": 'dimensions' option must be at least 1."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Array) { - logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: options.name || propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; +function convertAsArrayBuffer(buffer) { + // ArrayBuffer -> 16-bit character codes -> character array -> joined string. + return Array.from(new Uint16Array(buffer)).map(function (charCode) { return String.fromCharCode(charCode); }).join(''); } -function createArrayType(elementType, dimensions) { - var type = new ArrayTypeDescriptor(elementType); - for (var i = 1; i < dimensions; ++i) { - type = new ArrayTypeDescriptor(type); - } - return type; +/** + * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and + * returning that string. + */ +function convertAsDataView(dataView) { + return convertAsArrayBuffer(dataView.buffer); } // CONCATENATED MODULE: ./src/parser.ts @@ -1302,14 +1315,14 @@ var parser_TypedJSON = /** @class */ (function () { * @param settings Additional configuration settings. */ function TypedJSON(rootConstructor, settings) { - //#endregion + // #endregion this.serializer = new serializer_Serializer(); this.deserializer = new deserializer_Deserializer(); this.globalKnownTypes = []; this.indent = 0; var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { - throw new TypeError("The TypedJSON root data type must have the @jsonObject decorator used."); + throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); } this.nameResolver = function (ctor) { return nameof(ctor); }; this.rootConstructor = rootConstructor; @@ -1321,7 +1334,7 @@ var parser_TypedJSON = /** @class */ (function () { this.config({}); } } - //#region Static + // #region Static TypedJSON.parse = function (object, rootType, settings) { return new TypedJSON(rootType, settings).parse(object); }; @@ -1386,14 +1399,18 @@ var parser_TypedJSON = /** @class */ (function () { this.deserializer.setErrorHandler(settings.errorHandler); this.serializer.setErrorHandler(settings.errorHandler); } - if (settings.replacer) + if (settings.replacer) { this.replacer = settings.replacer; - if (settings.typeResolver) + } + if (settings.typeResolver) { this.deserializer.setTypeResolver(settings.typeResolver); - if (settings.typeHintEmitter) + } + if (settings.typeHintEmitter) { this.serializer.setTypeHintEmitter(settings.typeHintEmitter); - if (settings.indent) + } + if (settings.indent) { this.indent = settings.indent; + } if (settings.nameResolver) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); @@ -1403,7 +1420,7 @@ var parser_TypedJSON = /** @class */ (function () { // Type-check knownTypes elements to recognize errors in advance. settings.knownTypes.forEach(function (knownType, i) { // tslint:disable-next-line:no-null-keyword - if (typeof knownType === "undefined" || knownType === null) { + if (typeof knownType === 'undefined' || knownType === null) { logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value (element " + i + ")."); } }); @@ -1527,7 +1544,7 @@ var parser_TypedJSON = /** @class */ (function () { function jsonObject(optionsOrTarget) { var options; - if (typeof optionsOrTarget === "function") { + if (typeof optionsOrTarget === 'function') { // jsonObject is being used as a decorator, directly. options = {}; } @@ -1559,11 +1576,11 @@ function jsonObject(optionsOrTarget) { } if (options.knownTypes) { options.knownTypes - .filter(function (knownType) { return !!knownType; }) + .filter(function (knownType) { return Boolean(knownType); }) .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); } } - if (typeof optionsOrTarget === "function") { + if (typeof optionsOrTarget === 'function') { // jsonObject is being used as a decorator, directly. decorator(optionsOrTarget); } @@ -1582,14 +1599,14 @@ function isSubClass(target) { function jsonMember(optionsOrPrototype, propKey) { - if (propKey && (typeof propKey === "string" || typeof propKey === "symbol")) { + if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) { var prototype = optionsOrPrototype; // For error messages. var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); // jsonMember used directly, no additional information directly available besides target and propKey. // Obtain property constructor through ReflectDecorators. if (isReflectMetadataSupported) { - var reflectPropCtor = Reflect.getMetadata("design:type", prototype, propKey); + var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); if (!reflectPropCtor) { logError(decoratorName + ": could not resolve detected property constructor at runtime. " + MISSING_REFLECT_CONF_MSG); return; @@ -1615,21 +1632,21 @@ function jsonMember(optionsOrPrototype, propKey) { var options = optionsOrPrototype || {}; var typeDescriptor; var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); // For error messages. - if (options.hasOwnProperty("constructor")) { + if (options.hasOwnProperty('constructor')) { if (!isValueDefined(options.constructor)) { logError(decoratorName + ": cannot resolve specified property constructor at runtime."); return; } // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata("design:type", target, _propKey))) { + if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { logWarning(decoratorName + ": detected property type does not match 'constructor' option."); } } else { // Use ReflectDecorators to obtain property constructor. if (isReflectMetadataSupported) { - var reflectCtor = Reflect.getMetadata("design:type", target, _propKey); + var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); if (!reflectCtor) { logError(decoratorName + ": cannot resolve detected property constructor at runtime."); return; @@ -1696,7 +1713,7 @@ function jsonSetMember(elementConstructor, options) { return; } // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Set) { + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) { logError(decoratorName + ": property is not a Set. " + MISSING_REFLECT_CONF_MSG); return; } @@ -1738,7 +1755,7 @@ function jsonMapMember(keyConstructor, valueConstructor, options) { return; } // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Map) { + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Map) { logError(decoratorName + ": property is not a Map. " + MISSING_REFLECT_CONF_MSG); return; } diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 1ab3cb8..4563a82 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import { Serializable } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"' +\n ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type 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 isDirectlyDeserializableNativeType(type: Function): boolean\n{\n return !!(~[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 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: Serializable): 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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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: Serializable): 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 public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata\n {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = 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 objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n return objectMetadata;\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 = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n public knownTypes = new Set>();\n /** If present override the global function */\n public typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n public typeResolver?: TypeResolver;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === \"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 prototype[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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 getTypeHintEmitter(): TypeHintEmitter\n {\n return this.typeHintEmitter;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`),\n );\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else\n {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter)\n {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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\n // to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: any[],\n typeDescriptor: TypeDescriptor,\n memberName:string ,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | { key: any, value: any }[] {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\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: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction 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 */\nfunction 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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView)\n{\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import { isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeResolver } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject, knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 public options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this.nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n public getTypeResolver(): TypeResolver\n {\n return this.typeResolver;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer)\n {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`),\n );\n }\n\n public instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n public 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 public 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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string)\n{\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor)\n {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject|T|undefined {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`)\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver)\n {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = 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 = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 ${memberName}:`\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 ${memberName}:`\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 deserializer.getErrorHandler()(e);\n return undefined;\n }\n }\n else\n {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n deserializer.getErrorHandler()(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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n }\n catch (e)\n {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n })\n }\n else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 {\n return new Date(sourceObject as any);\n }\n else if (sourceObject instanceof Date)\n {\n return sourceObject\n }\n else\n {\n throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++)\n {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject, Serializable } from \"./typedjson/types\";\nimport { Serializer, defaultTypeEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, defaultTypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport { defaultTypeResolver, defaultTypeEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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: Serializable, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\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: Serializable, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertSingleValue(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Serializable): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertSingleValue(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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.convertSingleValue(object, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(\n object: Map, keyConstructor: Serializable,\n ): IndexedObject | { key: any, value: any }[] | undefined {\n try\n {\n return this.serializer.convertSingleValue(object, MapT(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: Serializable): 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","import { Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Function[];\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable\n): ((target: Serializable) => 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: Serializable\n ): void {\n // Create or obtain JsonObjectMetadata object.\n let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver)\n {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter)\n {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes)\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\nfunction isSubClass(target: Serializable) {\n return\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\nimport { IndexedObject } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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\", prototype, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\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 = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from \"./parser\";\nexport { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from \"./typedjson/metadata\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) {\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined {\n if (sourceObject.__type) {\nreturn knownTypes.get(sourceObject.__type);\n}\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) {\n const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`),\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 | TypeDescriptor, options: IJsonArrayMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\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 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 logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`,\n));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`,\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\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 this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`,\n);\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(object: Array>>>, dimensions: 4): Array>>>;\n toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor));\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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 const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function;\n\n if (!reflectCtor) {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\n 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 (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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 logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 39d7c37..58be7ff 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-07-27 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 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: Serializable): 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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`ERROR: ${message}`, ...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(message, ...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(message, ...optionalParams);\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log(`WARNING: ${message}`, ...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 return \"undefined\";\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { OptionsBase } from \"./options-base\";\nimport { TypeDescriptor } from \"./type-descriptor\";\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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: Serializable): 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 public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata\n {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = 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 objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n return objectMetadata;\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 = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n public knownTypes = new Set>();\n /** If present override the global function */\n public typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n public typeResolver?: TypeResolver;\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 options?: OptionsBase;\n\n public onDeserializedMethodName?: string;\n\n public beforeSerializationMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === \"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 prototype[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: (keyof OptionsBase)[] = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as string[]).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case \"preserveNull\":\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) return options[key]!;\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase|undefined {\n return !moreSpecific\n ? existing\n : Object.assign(\n {},\n existing,\n moreSpecific,\n );\n}\n","export abstract class TypeDescriptor {\n protected constructor(public readonly ctor: Function) {}\n\n getTypes(): Function[] {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor|Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(public readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n public readonly keyType: TypeDescriptor,\n public readonly valueType: TypeDescriptor,\n public readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Function[] {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === \"function\" || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from \"./helpers\";\nimport { IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 public options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter)\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 getTypeHintEmitter(): TypeHintEmitter\n {\n return this.typeHintEmitter;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null;\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor))\n {\n let expectedName = nameof(typeDescriptor.ctor);\n let actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`),\n );\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`),\n );\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor)\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(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata)\n {\n\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === \"function\")\n {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n else\n {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter)\n {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) =>\n {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\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\n // to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: any[],\n typeDescriptor: TypeDescriptor,\n memberName:string ,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:` +\n ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(\n element, typeDescriptor.elementType, memberName, memberOptions\n ),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName)\n {\n memberName += \"[]\";\n }\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // 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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | { key: any, value: any }[] {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType)\n {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName)\n {\n memberName += \"[]\";\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\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: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined)\n {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction 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 */\nfunction 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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView)\n{\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import { isSubtypeOf, isValueDefined, logError, nameof } from \"./helpers\";\nimport { Constructor, IndexedObject, Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeResolver } from \"./metadata\";\nimport { getOptionValue, mergeOptions, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject, knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 public options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this.nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: TypeResolver)\n {\n if (typeof typeResolverCallback !== \"function\")\n {\n throw new TypeError(\"'typeResolverCallback' is not a function.\");\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n public getTypeResolver(): TypeResolver\n {\n return this.typeResolver;\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 getErrorHandler(): (error: Error) => void\n {\n return this.errorHandler;\n }\n\n public convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = \"object\",\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null)\n {\n return null;\n }\n else if (!isValueDefined(sourceObject))\n {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer)\n {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === \"object\")\n {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`),\n );\n }\n\n public instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n public 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 public 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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n }\n\n public retrievePreserveNull(memberOptions?: OptionsBase): boolean\n {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string)\n{\n const expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n const actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor)\n {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject|T|undefined {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`)\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver)\n {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = 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 = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) =>\n {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer)\n {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n }\n else if (objMemberMetadata.type)\n {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n else\n {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n }\n else if (objMemberMetadata.isRequired)\n {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\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 ${memberName}:`\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 ${memberName}:`\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 deserializer.getErrorHandler()(e);\n return undefined;\n }\n }\n else\n {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n deserializer.getErrorHandler()(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 const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): any[] {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n }\n catch (e)\n {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!(Array.isArray(sourceObject)))\n {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try\n {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === \"object\");\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor))\n {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape))\n {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType)\n {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT)\n {\n Object.keys(sourceObject).forEach(key => {\n try\n {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey))\n {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n })\n }\n else\n {\n sourceObject.forEach((element: any) => {\n try\n {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\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 deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 {\n return new Date(sourceObject as any);\n }\n else if (sourceObject instanceof Date)\n {\n return sourceObject\n }\n else\n {\n throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== \"string\")\n {\n throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++)\n {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem)))\n {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n \"a numeric source array\",\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase\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|TypeDescriptor, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import { Constructor, IndexedObject, Serializable } from \"./typedjson/types\";\nimport { Serializer, defaultTypeEmitter } from \"./typedjson/serializer\";\nimport { Deserializer, defaultTypeResolver } from \"./typedjson/deserializer\";\nimport { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from \"./typedjson/metadata\";\nimport { logError, logWarning, nameof, parseToJSObject } from \"./typedjson/helpers\";\nimport { extractOptionBase, OptionsBase } from \"./typedjson/options-base\";\nimport { createArrayType } from \"./typedjson/json-array-member\";\nimport { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport { defaultTypeResolver, defaultTypeEmitter };\n\nexport interface ITypedJSONSettings extends OptionsBase\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?: TypeResolver;\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?: TypeHintEmitter;\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: Serializable, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Serializable,\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: Serializable, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): Object[]|undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject|{ key: any, value: any }[]|undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Serializable, 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: Serializable, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, 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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\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(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n 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 return this.deserializer.convertSingleValue(json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes)\n );\n }\n\n public parseAsMap(object: any, keyConstructor: Serializable): Map\n {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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(\n object,\n ensureTypeDescriptor(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 return this.serializer.convertSingleValue(\n object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\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.convertSingleValue(object, SetT(this.rootConstructor));\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(\n object: Map, keyConstructor: Serializable,\n ): IndexedObject | { key: any, value: any }[] | undefined {\n try\n {\n return this.serializer.convertSingleValue(object, MapT(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: Serializable): 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","import { Serializable } from \"./types\";\nimport { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Function[];\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable\n): ((target: Serializable) => 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: Serializable\n ): void {\n // Create or obtain JsonObjectMetadata object.\n let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver)\n {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter)\n {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\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 const optionsBase = extractOptionBase(options);\n if (optionsBase)\n {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes)\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\nfunction isSubClass(target: Serializable) {\n return\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf, MISSING_REFLECT_CONF_MSG,\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from \"./type-descriptor\";\nimport { IndexedObject } from './types';\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function|TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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\", prototype, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\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 = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor|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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n const reflectCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!reflectCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\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\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor))\n {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor)\n{\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === 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 (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === 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 { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, SetT } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase\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 const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor))\n {\n 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 (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, MISSING_REFLECT_CONF_MSG } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\nimport { extractOptionBase, OptionsBase } from \"./options-base\";\nimport { isTypelike, MapOptions, MapT, TypeDescriptor } from \"./type-descriptor\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial\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(\n keyConstructor: Function|TypeDescriptor,\n valueConstructor: Function|TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) =>\n {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor))\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor))\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. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { TypedJSON } from \"../parser\";\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n }\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n }\n}\n","export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from \"./parser\";\nexport { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from \"./typedjson/metadata\";\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\";\nexport { toJson } from \"./typedjson/to-json\";\nexport { ArrayT, SetT, MapT } from \"./typedjson/type-descriptor\";\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","undefined","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","resultSet","i","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) {\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined {\n if (sourceObject.__type) {\nreturn knownTypes.get(sourceObject.__type);\n}\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) {\n const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`),\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 | TypeDescriptor, options: IJsonArrayMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\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 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 logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`,\n));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`,\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\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 this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`,\n);\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(object: Array>>>, dimensions: 4): Array>>>;\n toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor));\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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 const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function;\n\n if (!reflectCtor) {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\n 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 (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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 logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/deserializer.d.ts b/js/typedjson/deserializer.d.ts index fdd4b33..934eec6 100644 --- a/js/typedjson/deserializer.d.ts +++ b/js/typedjson/deserializer.d.ts @@ -1,7 +1,7 @@ -import { IndexedObject } from "./types"; -import { TypeResolver } from "./metadata"; -import { OptionsBase } from "./options-base"; -import { TypeDescriptor } from "./type-descriptor"; +import { TypeResolver } from './metadata'; +import { OptionsBase } from './options-base'; +import { TypeDescriptor } from './type-descriptor'; +import { IndexedObject } from './types'; export declare function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined; export declare type DeserializerFn = (sourceObject: Raw, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName: string, deserializer: Deserializer, memberOptions?: OptionsBase) => T; /** diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts index aeac3d8..f0f73da 100644 --- a/js/typedjson/helpers.d.ts +++ b/js/typedjson/helpers.d.ts @@ -16,9 +16,9 @@ export declare function parseToJSObject(json: any, expectedType: Serializable * @param B The supposed base type. */ export declare function isSubtypeOf(A: Function, B: Function): boolean; -export declare function logError(message?: any, ...optionalParams: any[]): void; -export declare function logMessage(message?: any, ...optionalParams: any[]): void; -export declare function logWarning(message?: any, ...optionalParams: any[]): void; +export declare function logError(message?: any, ...optionalParams: Array): void; +export declare function logMessage(message?: any, ...optionalParams: Array): void; +export declare function logWarning(message?: any, ...optionalParams: Array): void; /** * Checks if the value is considered defined (not undefined and not null). * @param value diff --git a/js/typedjson/json-array-member.d.ts b/js/typedjson/json-array-member.d.ts index b97b409..dea7b47 100644 --- a/js/typedjson/json-array-member.d.ts +++ b/js/typedjson/json-array-member.d.ts @@ -1,5 +1,5 @@ -import { OptionsBase } from "./options-base"; -import { ArrayTypeDescriptor, TypeDescriptor } from "./type-descriptor"; +import { OptionsBase } from './options-base'; +import { ArrayTypeDescriptor, TypeDescriptor } from './type-descriptor'; export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; diff --git a/js/typedjson/json-map-member.d.ts b/js/typedjson/json-map-member.d.ts index d89ec3d..677372e 100644 --- a/js/typedjson/json-map-member.d.ts +++ b/js/typedjson/json-map-member.d.ts @@ -1,5 +1,5 @@ -import { OptionsBase } from "./options-base"; -import { MapOptions, TypeDescriptor } from "./type-descriptor"; +import { OptionsBase } from './options-base'; +import { MapOptions, TypeDescriptor } from './type-descriptor'; export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts index 627d9f5..912bfc1 100644 --- a/js/typedjson/json-member.d.ts +++ b/js/typedjson/json-member.d.ts @@ -1,5 +1,5 @@ -import { OptionsBase } from "./options-base"; -import { TypeDescriptor } from "./type-descriptor"; +import { OptionsBase } from './options-base'; +import { TypeDescriptor } from './type-descriptor'; import { IndexedObject } from './types'; export interface IJsonMemberOptions extends OptionsBase { /** diff --git a/js/typedjson/json-object.d.ts b/js/typedjson/json-object.d.ts index ce6b712..c8f0994 100644 --- a/js/typedjson/json-object.d.ts +++ b/js/typedjson/json-object.d.ts @@ -1,12 +1,12 @@ -import { Serializable } from "./types"; -import { TypeHintEmitter, TypeResolver } from "./metadata"; -import { OptionsBase } from "./options-base"; +import { TypeHintEmitter, TypeResolver } from './metadata'; +import { OptionsBase } from './options-base'; +import { Serializable } from './types'; export declare type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; export interface IJsonObjectOptionsBase extends OptionsBase { /** * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Function[]; + knownTypes?: Array; /** * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. */ diff --git a/js/typedjson/json-set-member.d.ts b/js/typedjson/json-set-member.d.ts index 5612b80..0b9a3e0 100644 --- a/js/typedjson/json-set-member.d.ts +++ b/js/typedjson/json-set-member.d.ts @@ -1,4 +1,4 @@ -import { OptionsBase } from "./options-base"; +import { OptionsBase } from './options-base'; export interface IJsonSetMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts index 17da64d..d331900 100644 --- a/js/typedjson/metadata.d.ts +++ b/js/typedjson/metadata.d.ts @@ -1,6 +1,6 @@ -import { IndexedObject, Serializable } from "./types"; -import { OptionsBase } from "./options-base"; -import { TypeDescriptor } from "./type-descriptor"; +import { OptionsBase } from './options-base'; +import { TypeDescriptor } from './type-descriptor'; +import { IndexedObject, Serializable } from './types'; export declare const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; export declare type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null; export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; diff --git a/js/typedjson/serializer.d.ts b/js/typedjson/serializer.d.ts index e5cc075..f41f579 100644 --- a/js/typedjson/serializer.d.ts +++ b/js/typedjson/serializer.d.ts @@ -1,7 +1,7 @@ -import { IndexedObject } from "./types"; -import { JsonObjectMetadata, TypeHintEmitter } from "./metadata"; -import { OptionsBase } from "./options-base"; -import { TypeDescriptor } from "./type-descriptor"; +import { JsonObjectMetadata, TypeHintEmitter } from './metadata'; +import { OptionsBase } from './options-base'; +import { TypeDescriptor } from './type-descriptor'; +import { IndexedObject } from './types'; export declare function defaultTypeEmitter(targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata): void; /** * @param sourceObject The original object that should be serialized. diff --git a/js/typedjson/type-descriptor.d.ts b/js/typedjson/type-descriptor.d.ts index 7fe7b5f..08a4d90 100644 --- a/js/typedjson/type-descriptor.d.ts +++ b/js/typedjson/type-descriptor.d.ts @@ -1,7 +1,7 @@ export declare abstract class TypeDescriptor { readonly ctor: Function; protected constructor(ctor: Function); - getTypes(): Function[]; + getTypes(): Array; } export declare type Typelike = TypeDescriptor | Function; export declare class ConcreteTypeDescriptor extends TypeDescriptor { @@ -13,13 +13,13 @@ export declare abstract class GenericTypeDescriptor extends TypeDescriptor { export declare class ArrayTypeDescriptor extends GenericTypeDescriptor { readonly elementType: TypeDescriptor; constructor(elementType: TypeDescriptor); - getTypes(): Function[]; + getTypes(): Array; } export declare function ArrayT(elementType: Typelike): ArrayTypeDescriptor; export declare class SetTypeDescriptor extends GenericTypeDescriptor { readonly elementType: TypeDescriptor; constructor(elementType: TypeDescriptor); - getTypes(): Function[]; + getTypes(): Array; } export declare function SetT(elementType: Typelike): SetTypeDescriptor; export declare const enum MapShape { @@ -43,7 +43,7 @@ export declare class MapTypeDescriptor extends GenericTypeDescriptor { readonly valueType: TypeDescriptor; readonly options?: Partial | undefined; constructor(keyType: TypeDescriptor, valueType: TypeDescriptor, options?: Partial | undefined); - getTypes(): Function[]; + getTypes(): Array; getCompleteOptions(): MapOptions; } export declare function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor; diff --git a/js/typedjson/types.d.ts b/js/typedjson/types.d.ts index d7959f9..a4bdb24 100644 --- a/js/typedjson/types.d.ts +++ b/js/typedjson/types.d.ts @@ -4,5 +4,5 @@ export declare type IndexedObject = Object & { export interface AbstractType extends Function { prototype: T; } -export declare type Constructor = new (...args: any[]) => T; +export declare type Constructor = new (...args: Array) => T; export declare type Serializable = Constructor | AbstractType; diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 55a1e37..6b7c7b6 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -1,7 +1,7 @@ -import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; -import { Everything, IEverything } from "./utils/everything"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {Everything, IEverything} from './utils/everything'; -describe('array of objects', function () { +describe('array of objects', () => { @jsonObject class Simple { @jsonMember @@ -10,36 +10,36 @@ describe('array of objects', function () { @jsonMember numProp: number; - constructor(init: {strProp: string, numProp: number}) + constructor(init: {strProp: string; numProp: number}) constructor() - constructor(init?: {strProp: string, numProp: number}) { + constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; } } - public foo() { + foo() { return `${this.strProp}-${this.numProp}`; } } - it('deserializes empty array', function () { + it('deserializes empty array', () => { const result = TypedJSON.parseAsArray('[]', Simple); expect(result).toBeDefined(); expect(result.length).toBe(0); }); - it('serialized empty array', function () { + it('serialized empty array', () => { const result = TypedJSON.stringifyAsArray([], Simple); expect(result).toBe('[]'); }); - it('deserialized should be of proper type', function () { + it('deserialized should be of proper type', () => { const expectation = [ - { strProp: 'delta', numProp: 4 }, - { strProp: 'bravo', numProp: 2 }, - { strProp: 'gamma', numProp: 0 }, + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, ]; const result = TypedJSON.parseAsArray(JSON.stringify(expectation), Simple); @@ -51,11 +51,11 @@ describe('array of objects', function () { }); }); - it('serialized should contain all elements', function () { + it('serialized should contain all elements', () => { const expectation = [ - { strProp: 'delta', numProp: 4 }, - { strProp: 'bravo', numProp: 2 }, - { strProp: 'gamma', numProp: 0 }, + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, ]; const result = TypedJSON.stringifyAsArray(expectation.map(obj => new Simple(obj)), Simple); @@ -64,27 +64,27 @@ describe('array of objects', function () { }); }); -describe('multidimensional arrays', function () { +describe('multidimensional arrays', () => { interface IWithArrays { - one: IEverything[]; - two: IEverything[][]; - deep: IEverything[][][][][][]; - arrayWithArray?: IWithArrays[][]; + one: Array; + two: Array>; + deep: Array>>>>>; + arrayWithArray?: Array>; } @jsonObject class WithArrays implements IWithArrays { @jsonArrayMember(Everything) - one: Everything[]; + one: Array; @jsonArrayMember(Everything, {dimensions: 2}) - two: Everything[][]; + two: Array>; @jsonArrayMember(Everything, {dimensions: 6}) - deep: Everything[][][][][][]; + deep: Array>>>>>; @jsonArrayMember(WithArrays, {dimensions: 2}) - arrayWithArray?: WithArrays[][]; + arrayWithArray?: Array>; constructor(init: IWithArrays) constructor() @@ -117,14 +117,14 @@ describe('multidimensional arrays', function () { expected ? Everything.expected() : Everything.create(), ], two: [ - [ expected ? Everything.expected() : Everything.create() ], - [ expected ? Everything.expected() : Everything.create() ], + [expected ? Everything.expected() : Everything.create()], + [expected ? Everything.expected() : Everything.create()], [], [], ], deep: [[[[ [], - [[ expected ? Everything.expected() : Everything.create() ]], + [[expected ? Everything.expected() : Everything.create()]], ]]]], arrayWithArray: [ [], @@ -135,7 +135,7 @@ describe('multidimensional arrays', function () { return expected ? new WithArrays(result) : result; } - function createTestArray(expected: boolean): IWithArrays[][] { + function createTestArray(expected: boolean): Array> { return [ [], [ @@ -146,10 +146,10 @@ describe('multidimensional arrays', function () { [ createTestObject(expected), ], - ] + ]; } - it('deserializes', function () { + it('deserializes', () => { const result = TypedJSON.parseAsArray(JSON.stringify(createTestArray(false)), WithArrays, undefined, 2); expect(result).toBeOfLength(4); @@ -162,43 +162,43 @@ describe('multidimensional arrays', function () { expect(result[3][0]).toEqual(createTestObject(true)); }); - it('serializes', function () { + it('serializes', () => { const result = TypedJSON.stringifyAsArray(createTestArray(true), WithArrays, 2); expect(result).toBe(JSON.stringify(createTestArray(false))); }); }); -describe('array of raw objects', function () { +describe('array of raw objects', () => { @jsonObject class Translations { @jsonArrayMember(Object) - localization: any[]; + localization: Array; } function localization() { return [ { - "language_tag": "en_us", - "/actions/main": "My Game Actions", - "/actions/driving": "Driving", + language_tag: 'en_us', + '/actions/main': 'My Game Actions', + '/actions/driving': 'Driving', }, { - "language_tag": "fr", - "/actions/main": "Mes actions de jeux", - "/actions/driving": "Conduire", - } + language_tag: 'fr', + '/actions/main': 'Mes actions de jeux', + '/actions/driving': 'Conduire', + }, ]; } - it('should deserialize as is', function () { - const translations = TypedJSON.parse({"localization" : localization()}, Translations); + it('should deserialize as is', () => { + const translations = TypedJSON.parse({localization: localization()}, Translations); expect(translations).toBeDefined(); expect(translations instanceof Translations).toBeTruthy(); expect(translations.localization).toEqual(localization()); }); - it('should serialize as is', function () { + it('should serialize as is', () => { const translations = new Translations(); translations.localization = localization(); const json = TypedJSON.toPlainJson(translations, Translations); diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 0e32606..2ed3a67 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -1,22 +1,22 @@ -import { jsonObject, jsonMember, TypedJSON, jsonArrayMember } from "../src/typedjson"; -import { Everything } from "./utils/everything"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {Everything} from './utils/everything'; -describe('basic serialization of', function () { - describe('builtins', function () { - it('should deserialize', function () { +describe('basic serialization of', () => { + describe('builtins', () => { + it('should deserialize', () => { expect(TypedJSON.parse('"str"', String)).toEqual('str'); 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; + 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 () { + it('should serialize', () => { expect(TypedJSON.stringify('str', String)).toEqual('"str"'); expect(TypedJSON.stringify(45834, Number)).toEqual('45834'); expect(TypedJSON.stringify(true, Boolean)).toEqual('true'); @@ -35,7 +35,7 @@ describe('basic serialization of', function () { }); }); - describe('single class', function () { + describe('single class', () => { @jsonObject class Person { @jsonMember @@ -44,12 +44,12 @@ describe('basic serialization of', function () { @jsonMember lastName: string; - public getFullName() { - return this.firstName + " " + this.lastName; + getFullName() { + return `${this.firstName} ${this.lastName}`; } } - describe('deserialized', function () { + describe('deserialized', () => { beforeAll(function () { this.person = TypedJSON.parse('{ "firstName": "John", "lastName": "Doe" }', Person); }); @@ -64,9 +64,9 @@ describe('basic serialization of', function () { }); }); - describe('serialized', function () { - it('should contain all data', function () { - const person = new Person; + describe('serialized', () => { + it('should contain all data', () => { + const person = new Person(); person.firstName = 'John'; person.lastName = 'Doe'; expect(TypedJSON.stringify(person, Person)) @@ -75,8 +75,8 @@ describe('basic serialization of', function () { }); }); - describe('all types', function () { - it('should deserialized', function () { + describe('all types', () => { + it('should deserialized', () => { const everything = Everything.create(); const deserialized = TypedJSON.parse(JSON.stringify(everything), Everything); @@ -84,7 +84,7 @@ describe('basic serialization of', function () { expect(deserialized).toEqual(Everything.expected()); }); - it('should serialize', function () { + it('should serialize', () => { const everything = Everything.create(); const serialized = TypedJSON.stringify(new Everything(everything), Everything); @@ -93,17 +93,16 @@ describe('basic serialization of', function () { }); }); - describe('nullable', function () { - + describe('nullable', () => { @jsonObject class WithNullable { // nullable should be optional when not using preserve null @jsonMember - nullable?: string|null; + nullable?: string | null; } - it('should serialize to nothing', function () { - const nullClass = new WithNullable; + it('should serialize to nothing', () => { + const nullClass = new WithNullable(); nullClass.nullable = null; const serialized = TypedJSON.stringify(nullClass, WithNullable); @@ -111,22 +110,21 @@ describe('basic serialization of', function () { expect(serialized).toBe('{}'); }); - it('should deserialize to nothing when null', function () { + it('should deserialize to nothing when null', () => { const deserialized = TypedJSON.parse('{"nullable":null}', WithNullable); - expect(deserialized).toEqual(new WithNullable); + expect(deserialized).toEqual(new WithNullable()); }); - it('should deserialize to nothing when nothing', function () { + it('should deserialize to nothing when nothing', () => { const deserialized = TypedJSON.parse('{}', WithNullable); - expect(deserialized).toEqual(new WithNullable); + expect(deserialized).toEqual(new WithNullable()); }); }); - describe('class with defaults', function () { - - describe('by assigment', function () { + describe('class with defaults', () => { + describe('by assigment', () => { @jsonObject class WithDefaults { @jsonMember @@ -139,21 +137,21 @@ describe('basic serialization of', function () { bool: boolean = true; @jsonArrayMember(String) - arr: string[] = []; + arr: Array = []; @jsonMember present: number = 10; } - it('should use defaults when missing', function () { + it('should use defaults when missing', () => { const deserialized = TypedJSON.parse('{"present":5}', WithDefaults); - const expected = new WithDefaults; + const expected = new WithDefaults(); expected.present = 5; expect(deserialized).toEqual(expected); }); }); - describe('by constructor', function () { + describe('by constructor', () => { @jsonObject class WithCtr { @jsonMember @@ -166,7 +164,7 @@ describe('basic serialization of', function () { bool: boolean; @jsonArrayMember(String) - arr: string[]; + arr: Array; @jsonMember present: number; @@ -180,20 +178,19 @@ describe('basic serialization of', function () { } } - it('should use defaults when missing', function () { + it('should use defaults when missing', () => { const deserialized = TypedJSON.parse('{"present":5}', WithCtr); - const expected = new WithCtr; + const expected = new WithCtr(); expected.present = 5; expect(deserialized).toEqual(expected); }); }); }); - describe('getters/setters', function () { - + describe('getters/setters', () => { @jsonObject class SomeClass { - private _prop: string = "value"; + private _prop: string = 'value'; @jsonMember get prop(): string { return this._prop; @@ -202,70 +199,68 @@ describe('basic serialization of', function () { this._prop = val; } - private _getterOnly: string = "getter"; + private _getterOnly: string = 'getter'; @jsonMember get getterOnly(): string { return this._getterOnly; } - private _setterOnly: string = "setter"; + private _setterOnly: string = 'setter'; @jsonMember set setterOnly(val: string) { this._setterOnly = val; } } - it('should serialize', function () { - const serialized = TypedJSON.stringify(new SomeClass, SomeClass); + it('should serialize', () => { + const serialized = TypedJSON.stringify(new SomeClass(), SomeClass); expect(serialized).toBe('{"prop":"value","getterOnly":"getter"}'); }); - it('should deserialize', function () { + it('should deserialize', () => { const deserialized = TypedJSON.parse( '{"prop":"other value","setterOnly":"ok"}', SomeClass, ); - const expected = new SomeClass; - expected.prop = "other value"; - expected.setterOnly = "ok"; + const expected = new SomeClass(); + expected.prop = 'other value'; + expected.setterOnly = 'ok'; expect(deserialized).toEqual(expected); }); - it('should deserialize ignoring readonly properties', function () { + it('should deserialize ignoring readonly properties', () => { pending('this is not supported as of now'); const deserialized = TypedJSON.parse( '{"prop":"other value","getterOnly":"ignored","setterOnly":"ok"}', SomeClass, ); - const expected = new SomeClass; - expected.prop = "other value"; - expected.setterOnly = "ok"; + const expected = new SomeClass(); + expected.prop = 'other value'; + expected.setterOnly = 'ok'; expect(deserialized).toEqual(expected); }); }); - describe('structural inheritance', function () { - class JustForOrganizationalPurpose - { + describe('structural inheritance', () => { + class JustForOrganizationalPurpose { } @jsonObject - class Child extends JustForOrganizationalPurpose - { + class Child extends JustForOrganizationalPurpose { } - it('should work for unannotated base class', function () { - expect(TypedJSON.stringify(new Child, Child)).toEqual('{}'); - expect(TypedJSON.parse('{}', Child)).toEqual(new Child); + it('should work for unannotated base class', () => { + expect(TypedJSON.stringify(new Child(), Child)).toEqual('{}'); + expect(TypedJSON.parse('{}', Child)).toEqual(new Child()); }); - it('should throw when using passing base for serialization/deserialization', function () { - expect(() => TypedJSON.stringify(new Child, JustForOrganizationalPurpose)).toThrow(); + it('should throw when using passing base for serialization/deserialization', () => { + expect(() => TypedJSON.stringify(new Child(), JustForOrganizationalPurpose)).toThrow(); expect(() => TypedJSON.parse('{}', JustForOrganizationalPurpose)).toThrow(); - }) + }); }); }); diff --git a/spec/beforeSerialization.spec.ts b/spec/beforeSerialization.spec.ts index 2f4ba2f..8046e21 100644 --- a/spec/beforeSerialization.spec.ts +++ b/spec/beforeSerialization.spec.ts @@ -1,10 +1,9 @@ -import { jsonObject, jsonMember, TypedJSON } from "../src/typedjson"; +import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -describe('beforeSerialization', function () { - - it('should call the static method', function () { +describe('beforeSerialization', () => { + it('should call the static method', () => { @jsonObject({ - beforeSerialization: 'beforeSerial' + beforeSerialization: 'beforeSerial', }) class Person { @jsonMember @@ -13,14 +12,14 @@ describe('beforeSerialization', function () { @jsonMember isOld: boolean; - public static beforeSerial() { + static beforeSerial() { // to have been called } } spyOn(Person, 'beforeSerial'); - const youngPerson = TypedJSON.parse({ age: 10 }, Person); + const youngPerson = TypedJSON.parse({age: 10}, Person); expect(youngPerson instanceof Person).toBeTruthy(); expect(youngPerson.isOld).toBeUndefined(); TypedJSON.stringify(youngPerson, Person); @@ -28,9 +27,9 @@ describe('beforeSerialization', function () { expect(Person.beforeSerial).toHaveBeenCalled(); }); - it('should call the member method', function () { + it('should call the member method', () => { @jsonObject({ - beforeSerialization: 'beforeSerial' + beforeSerialization: 'beforeSerial', }) class Person { @jsonMember @@ -39,7 +38,7 @@ describe('beforeSerialization', function () { @jsonMember isOld: boolean; - public beforeSerial() { + beforeSerial() { if (this.age < 20) { this.isOld = false; } else { @@ -48,8 +47,8 @@ describe('beforeSerialization', function () { } } - const youngPerson = TypedJSON.parse({ age: 10 }, Person); - const oldPerson = TypedJSON.parse({ age: 50 }, Person); + const youngPerson = TypedJSON.parse({age: 10}, Person); + const oldPerson = TypedJSON.parse({age: 50}, Person); expect(youngPerson instanceof Person).toBeTruthy(); expect(oldPerson instanceof Person).toBeTruthy(); @@ -62,9 +61,9 @@ describe('beforeSerialization', function () { expect(oldPersonUntyped['isOld']).toBeTruthy(); }); - it('should prefer the member method when there are both', function () { + it('should prefer the member method when there are both', () => { @jsonObject({ - beforeSerialization: 'beforeSerial' + beforeSerialization: 'beforeSerial', }) class Person { @jsonMember @@ -77,18 +76,18 @@ describe('beforeSerialization', function () { spyOn(this, 'beforeSerial'); } - public beforeSerial() { + beforeSerial() { // should call } - public static beforeSerial() { + static beforeSerial() { // should NOT call } } spyOn(Person, 'beforeSerial'); - const youngPerson = TypedJSON.parse({ age: 10 }, Person); + const youngPerson = TypedJSON.parse({age: 10}, Person); expect(youngPerson instanceof Person).toBeTruthy(); expect(youngPerson.isOld).toBeUndefined(); diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index e4acf97..f9d684f 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -1,17 +1,16 @@ -import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from "../src/typedjson"; - -describe('custom member deserializer', function () { +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +describe('custom member deserializer', () => { @jsonObject class Person { - @jsonMember({ deserializer: ((json: any) => json[0]) }) + @jsonMember({deserializer: (json: any) => json[0]}) firstName: string; @jsonMember lastName: string; - public getFullName() { - return this.firstName + " " + this.lastName; + getFullName() { + return `${this.firstName} ${this.lastName}`; } } @@ -36,20 +35,18 @@ describe('custom member deserializer', function () { it('should not affect serialization', function () { expect(TypedJSON.stringify(this.person, Person)).toBe('{"firstName":"John","lastName":"Doe"}'); }); - }); -describe('custom array member deserializer', function () { - +describe('custom array member deserializer', () => { @jsonObject class Obj { - @jsonArrayMember(Number, { deserializer: ((json: any) => json.split(',').map((v) => parseInt(v, 10))) }) - nums: number[]; + @jsonArrayMember(Number, {deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10))}) + nums: Array; @jsonMember str: string; - public sum() { + sum() { return this.nums.reduce((sum, cur) => sum + cur, 0); } } @@ -59,7 +56,7 @@ describe('custom array member deserializer', function () { }); it('should properly deserialize', function () { - expect(this.obj.nums).toEqual([1,2,3,4,5]); + expect(this.obj.nums).toEqual([1, 2, 3, 4, 5]); expect(this.obj.str).toBe('Some string'); }); @@ -75,11 +72,9 @@ describe('custom array member deserializer', function () { it('should not affect serialization', function () { expect(TypedJSON.stringify(this.obj, Obj)).toBe('{"nums":[1,2,3,4,5],"str":"Some string"}'); }); - }); -describe('custom delegating array member serializer', function () { - +describe('custom delegating array member serializer', () => { @jsonObject class Inner { @jsonMember @@ -90,7 +85,7 @@ describe('custom delegating array member serializer', function () { } } - function objArrayDeserializer(values: {prop: string, shouldDeserialize: boolean}[]|undefined) { + function objArrayDeserializer(values: Array<{prop: string; shouldDeserialize: boolean}> | undefined) { if (values) { return TypedJSON.parseAsArray( values.filter(value => value.shouldDeserialize), @@ -101,28 +96,30 @@ describe('custom delegating array member serializer', function () { @jsonObject class Obj { - @jsonArrayMember(Inner, { deserializer: objArrayDeserializer }) - inners: Inner[]; + @jsonArrayMember(Inner, {deserializer: objArrayDeserializer}) + inners: Array; @jsonMember str: string; } beforeAll(function () { - this.obj = TypedJSON.parse(JSON.stringify({ + this.obj = TypedJSON.parse( + JSON.stringify({ inners: [ { prop: 'something', - shouldDeserialize: false + shouldDeserialize: false, }, { prop: 'gogo', - shouldDeserialize: true + shouldDeserialize: true, }, ], str: 'Text', }), - Obj); + Obj, + ); }); it('should properly serialize', function () { @@ -135,5 +132,4 @@ describe('custom delegating array member serializer', function () { expect(this.obj.inners[0]).toHaveProperties({prop: 'gogo'}); expect(this.obj.inners[0].woo()).toEqual('hoo'); }); - }); diff --git a/spec/custom-serializer.spec.ts b/spec/custom-serializer.spec.ts index a979341..df5ab17 100644 --- a/spec/custom-serializer.spec.ts +++ b/spec/custom-serializer.spec.ts @@ -1,17 +1,16 @@ -import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; - -describe('custom member serializer', function () { +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +describe('custom member serializer', () => { @jsonObject class Person { - @jsonMember({ serializer: ((value: string) => value.split(' ')) }) + @jsonMember({serializer: (value: string) => value.split(' ')}) firstName: string; @jsonMember lastName: string; - public getFullName() { - return this.firstName + " " + this.lastName; + getFullName() { + return `${this.firstName} ${this.lastName}`; } } @@ -25,36 +24,35 @@ describe('custom member serializer', function () { it('should properly serialize', function () { expect(this.json).toEqual( { - firstName:['Mulit', 'term', 'name'], + firstName: ['Mulit', 'term', 'name'], lastName: 'Surname', - }); + }, + ); }); - it('should not affect deserialization', function () { + it('should not affect deserialization', () => { expect(TypedJSON.parse('{"firstName":"name","lastName":"last"}', Person)) .toEqual(Object.assign(new Person(), {firstName: 'name', lastName: 'last'})); }); - }); -describe('custom array member serializer', function () { - +describe('custom array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(Number, { serializer: ((values: number[]) => values.join(',')) }) - nums: number[]; + @jsonArrayMember(Number, {serializer: (values: Array) => values.join(',')}) + nums: Array; @jsonMember str: string; - public sum() { + sum() { return this.nums.reduce((sum, cur) => sum + cur, 0); } } beforeAll(function () { this.obj = new Obj(); - this.obj.nums = [3,45,34]; + this.obj.nums = [3, 45, 34]; this.obj.str = 'Text'; this.json = JSON.parse(TypedJSON.stringify(this.obj, Obj)); }); @@ -64,18 +62,17 @@ describe('custom array member serializer', function () { { nums: '3,45,34', str: 'Text', - }); + }, + ); }); - it('should not affect deserialization', function () { + it('should not affect deserialization', () => { expect(TypedJSON.parse('{"nums":[4,5,6,7],"str":"string"}', Obj)) - .toEqual(Object.assign(new Obj(), {nums: [4,5,6,7], str: 'string'} as Obj)); + .toEqual(Object.assign(new Obj(), {nums: [4, 5, 6, 7], str: 'string'} as Obj)); }); - }); -describe('custom delegating array member serializer', function () { - +describe('custom delegating array member serializer', () => { @jsonObject class Inner { @jsonMember @@ -91,7 +88,7 @@ describe('custom delegating array member serializer', function () { } } - function objArraySerializer(values: Inner[]) { + function objArraySerializer(values: Array) { return TypedJSON.toPlainArray( values.filter(value => value.shouldSerialize), Inner, @@ -100,8 +97,8 @@ describe('custom delegating array member serializer', function () { @jsonObject class Obj { - @jsonArrayMember(Inner, { serializer: objArraySerializer }) - inners: Inner[]; + @jsonArrayMember(Inner, {serializer: objArraySerializer}) + inners: Array; @jsonMember str: string; @@ -126,7 +123,7 @@ describe('custom delegating array member serializer', function () { }, ], str: 'Text', - }); + }, + ); }); - }); diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index 3effe3d..9bc138e 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -1,7 +1,7 @@ -beforeEach(function() { +beforeEach(() => { jasmine.addMatchers({ toHaveProperties(util, customEqualityMatchers): jasmine.CustomMatcher { - function equalOnPropNames(actual: T, expected: (keyof T)[]): boolean { + function equalOnPropNames(actual: T, expected: Array): boolean { return expected.every(prop => prop in actual); } @@ -16,8 +16,8 @@ beforeEach(function() { return { compare( actual: T, - expected: Partial|(keyof T)[], - ...customMsgs: any[] + expected: Partial | Array, + ...customMsgs: Array ) { let pass: boolean; let name: string; @@ -31,11 +31,9 @@ beforeEach(function() { return { pass, - message: util.buildFailureMessage( - name, pass, actual, expected, ...customMsgs, - ), + message: util.buildFailureMessage(name, pass, actual, expected, ...customMsgs), }; - } + }, }; }, toBeInstanceOf(util): jasmine.CustomMatcher { @@ -43,15 +41,13 @@ beforeEach(function() { compare( actual: T, expected: Function, - ...customMsgs: any[] + ...customMsgs: Array ) { const pass = actual instanceof expected; return { pass, - message: util.buildFailureMessage( - 'To be instance of', pass, actual, expected, ...customMsgs, - ), - } + message: util.buildFailureMessage('To be instance of', pass, actual, expected, ...customMsgs), + }; }, }; }, @@ -60,25 +56,22 @@ beforeEach(function() { compare>( actual: T, expected: number, - ...customMsgs: any[] + ...customMsgs: Array ) { const pass = actual && actual.length === expected; return { pass, - message: util.buildFailureMessage( - 'To be of length', pass, actual, expected, ...customMsgs, - ), - } + message: util.buildFailureMessage('To be of length', pass, actual, expected, ...customMsgs), + }; }, }; }, }); - jasmine.addCustomEqualityTester(function (first: any, second: any): boolean|undefined { - const firstAsInt8Array: Int8Array|undefined = tryAsInt8Array(first); - const secondAsInt8Array: Int8Array|undefined = tryAsInt8Array(second); + jasmine.addCustomEqualityTester((first: any, second: any): boolean | undefined => { + const firstAsInt8Array: Int8Array | undefined = tryAsInt8Array(first); + const secondAsInt8Array: Int8Array | undefined = tryAsInt8Array(second); - if (!firstAsInt8Array || !secondAsInt8Array) - { + if (!firstAsInt8Array || !secondAsInt8Array) { return; } @@ -89,24 +82,21 @@ beforeEach(function() { }); }); -function tryAsInt8Array(obj: any): Int8Array|undefined { - if (obj instanceof ArrayBuffer) - { +function tryAsInt8Array(obj: any): Int8Array | undefined { + if (obj instanceof ArrayBuffer) { return new Int8Array(obj); - } - else if (ArrayBuffer.isView(obj)) - { + } else if (ArrayBuffer.isView(obj)) { return new Int8Array(obj.buffer); } } - declare namespace jasmine { + /* eslint-disable @typescript-eslint/method-signature-style */ interface Matchers { - toHaveProperties(expectation: Partial|(keyof T)[], ...expectationFailOutput: any[]): boolean; - toBeInstanceOf(expectation: Function, ...expectationFailOutput: any[]): boolean; + toHaveProperties(expectation: Partial | Array, ...expectationFailOutput: Array): boolean; + toBeInstanceOf(expectation: Function, ...expectationFailOutput: Array): boolean; } interface ArrayLikeMatchers extends Matchers> { - toBeOfLength(expectation: number, ...expectationFailOutput: any[]): boolean; + toBeOfLength: (expectation: number, ...expectationFailOutput: Array) => boolean; } } diff --git a/spec/initializer.spec.ts b/spec/initializer.spec.ts index 4d17d10..8e66076 100644 --- a/spec/initializer.spec.ts +++ b/spec/initializer.spec.ts @@ -1,8 +1,7 @@ -import { jsonObject, jsonMember, TypedJSON } from "../src/typedjson"; +import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -describe('initializer', function () { - - it('should be called', function() { +describe('initializer', () => { + it('should be called', () => { const initializerSpy = jasmine.createSpy().and.callFake((src, raw) => { expect(src instanceof Person).toBeFalsy(); expect(src.getDescription).toBeUndefined(); @@ -24,7 +23,7 @@ describe('initializer', function () { @jsonMember city: string; - public getAddressLine() { + getAddressLine() { return `${this.street}, ${this.city}`; } } @@ -44,21 +43,21 @@ describe('initializer', function () { this.address = address; } - public getDescription() { + getDescription() { return `${this.name} is living at ${this.address.getAddressLine()}`; } } const person = TypedJSON.parse( {name: 'John', address: {street: '44th', city: 'New York'}}, - Person + Person, )!; expect(person instanceof Person).toBeTruthy(); expect(person.getDescription()).toEqual('John is living at 44th, New York'); expect(initializerSpy).toHaveBeenCalled(); }); - it('should fail if nothing is returned', function() { + it('should fail if nothing is returned', () => { const initializerSpy = jasmine.createSpy().and.callFake(() => null); @jsonObject({ @@ -68,7 +67,7 @@ describe('initializer', function () { @jsonMember name: string; - public getDescription() { + getDescription() { return `${this.name} is his name`; } } @@ -84,7 +83,7 @@ describe('initializer', function () { expect(errorHandlerSpy).toHaveBeenCalled(); }); - it('should fail if wrong type is returned', function() { + it('should fail if wrong type is returned', () => { const initializerSpy = jasmine.createSpy() .and.callFake((src) => new Person2(src.name)); @@ -95,7 +94,7 @@ describe('initializer', function () { @jsonMember name: string; - public getDescription() { + getDescription() { return `${this.name} is his name`; } } @@ -107,7 +106,7 @@ describe('initializer', function () { this.name = name; } - public getDescription() { + getDescription() { return `${this.name} is his name`; } } @@ -123,7 +122,7 @@ describe('initializer', function () { expect(errorHandlerSpy).toHaveBeenCalled(); }); - it('should accept subtypes', function() { + it('should accept subtypes', () => { const initializerSpy = jasmine.createSpy() .and.callFake((src) => new Person2(src.name, 123)); @@ -138,12 +137,12 @@ describe('initializer', function () { this.name = name; } - public getDescription() { + getDescription() { return `${this.name} is his name`; } } - class Person2 extends Person{ + class Person2 extends Person { age: number; constructor(name: string, age: number) { @@ -151,7 +150,7 @@ describe('initializer', function () { this.age = age; } - public getDescription() { + getDescription() { return `${super.getDescription()} and is ${this.age}y old`; } } diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index c0bbc1b..9821c45 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -1,8 +1,8 @@ -import { jsonArrayMember, jsonMember, jsonObject, TypedJSON } from "../src/typedjson"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -describe('json (without automatic stringify)', function () { - describe('string', function () { - it('should deserialize', function () { +describe('json (without automatic stringify)', () => { + describe('string', () => { + it('should deserialize', () => { // stringified json version cuz "" expect(TypedJSON.parse('"str"', String)).toEqual('str'); // already parsed @@ -12,16 +12,16 @@ describe('json (without automatic stringify)', function () { try { expect(TypedJSON.parse('"sdfs"fdsf"', String)).toEqual(undefined); fail(); - } catch(e) {} + } catch (e) {} }); - it('should serialize', function () { + it('should serialize', () => { expect(TypedJSON.toPlainJson('str', String)).toEqual('str'); }); }); - describe('rest of primitives', function () { - it('should deserialize', function () { + describe('rest of primitives', () => { + it('should deserialize', () => { expect(TypedJSON.parse(45834, Number)).toEqual(45834); expect(TypedJSON.parse(true, Boolean)).toEqual(true); expect(TypedJSON.parse(1543915254, Date)).toEqual(new Date(1543915254)); @@ -33,7 +33,7 @@ describe('json (without automatic stringify)', function () { expect(TypedJSON.parse([100, 117, 112, 97], Uint8Array)).toEqual(dataBuffer); }); - it('should serialize', function () { + it('should serialize', () => { expect(TypedJSON.toPlainJson(45834, Number)).toEqual(45834); expect(TypedJSON.toPlainJson(true, Boolean)).toEqual(true); const dateMs = new Date(1543915254); @@ -53,8 +53,7 @@ describe('json (without automatic stringify)', function () { }); }); - describe('object', function () { - + describe('object', () => { @jsonObject class SomeThing { @jsonMember @@ -62,7 +61,7 @@ describe('json (without automatic stringify)', function () { @jsonMember propNum: number; @jsonArrayMember(String) - propArr: String[]; + propArr: Array; @jsonMember propDate: Date; } @@ -74,23 +73,23 @@ describe('json (without automatic stringify)', function () { propDate: new Date(1543915254), }); - it('should deserialize', function () { + it('should deserialize', () => { 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 () { + it('should serialize', () => { 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 () { + describe('array', () => { + it('should deserialize', () => { expect(TypedJSON.parseAsArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); }); - it('should serialize', function () { + it('should serialize', () => { expect(TypedJSON.toPlainArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); }); }); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index b2a7791..b6d967e 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -1,10 +1,10 @@ -import { jsonObject } from '../src/typedjson/json-object'; -import { jsonMember } from '../src/typedjson/json-member'; -import { TypedJSON } from '../src/parser'; -import { ArrayT, jsonMapMember } from '../src/typedjson'; -import { MapShape } from '../src/typedjson/type-descriptor'; +import {TypedJSON} from '../src/parser'; +import {ArrayT, jsonMapMember} from '../src/typedjson'; +import {jsonMember} from '../src/typedjson/json-member'; +import {jsonObject} from '../src/typedjson/json-object'; +import {MapShape} from '../src/typedjson/type-descriptor'; -describe('map dictionary shape', function () { +describe('map dictionary shape', () => { @jsonObject class Simple { @jsonMember @@ -13,39 +13,42 @@ describe('map dictionary shape', function () { @jsonMember numProp: number; - constructor(init: { strProp: string, numProp: number }) + constructor(init: { strProp: string; numProp: number }) constructor() - constructor(init?: { strProp: string, numProp: number }) { + constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; } } - public foo() { + foo() { return `${this.strProp}-${this.numProp}`; } } @jsonObject class DictMap { - @jsonMapMember(String, Simple, { shape: MapShape.OBJECT}) + @jsonMapMember(String, Simple, {shape: MapShape.OBJECT}) prop: Map; - public getSetSize() { + getSetSize() { return this.prop.size; } } - it('deserializes', function () { - const result = TypedJSON.parse(JSON.stringify( - { - prop: { - one: {strProp: 'delta', numProp: 4}, - two: {strProp: 'gamma', numProp: 7}, - } - }), - DictMap); + it('deserializes', () => { + const result = TypedJSON.parse( + JSON.stringify( + { + prop: { + one: {strProp: 'delta', numProp: 4}, + two: {strProp: 'gamma', numProp: 7}, + }, + }, + ), + DictMap, + ); expect(result).toBeInstanceOf(DictMap); expect(result.prop).toBeDefined(); @@ -56,7 +59,7 @@ describe('map dictionary shape', function () { expect(result.prop.get('two').strProp).toBe('gamma'); }); - it('serializes', function () { + it('serializes', () => { const object = new DictMap(); object.prop = new Map([ ['one', new Simple({strProp: 'delta', numProp: 4})], @@ -68,12 +71,12 @@ describe('map dictionary shape', function () { prop: { one: {strProp: 'delta', numProp: 4}, two: {strProp: 'gamma', numProp: 7}, - } + }, })); }); }); -describe('map of array dictionary shape', function () { +describe('map of array dictionary shape', () => { @jsonObject class Simple { @jsonMember @@ -82,39 +85,42 @@ describe('map of array dictionary shape', function () { @jsonMember numProp: number; - constructor(init: { strProp: string, numProp: number }) + constructor(init: { strProp: string; numProp: number }) constructor() - constructor(init?: { strProp: string, numProp: number }) { + constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; } } - public foo() { + foo() { return `${this.strProp}-${this.numProp}`; } } @jsonObject class DictArrayMap { - @jsonMapMember(String, ArrayT(Simple), { shape: MapShape.OBJECT}) - prop: Map; + @jsonMapMember(String, ArrayT(Simple), {shape: MapShape.OBJECT}) + prop: Map>; - public getSetSize() { + getSetSize() { return this.prop.size; } } - it('deserializes', function () { - const result = TypedJSON.parse(JSON.stringify( - { - prop: { - one: [{strProp: 'delta', numProp: 4}], - two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], - } - }), - DictArrayMap); + it('deserializes', () => { + const result = TypedJSON.parse( + JSON.stringify( + { + prop: { + one: [{strProp: 'delta', numProp: 4}], + two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], + }, + }, + ), + DictArrayMap, + ); expect(result).toBeInstanceOf(DictArrayMap); expect(result.prop).toBeDefined(); @@ -128,9 +134,9 @@ describe('map of array dictionary shape', function () { expect(result.prop.get('two')[1].foo()).toBe('alpha-2'); }); - it('serializes', function () { + it('serializes', () => { const object = new DictArrayMap(); - object.prop = new Map([ + object.prop = new Map>([ ['one', [new Simple({strProp: 'delta', numProp: 4})]], ['two', [new Simple({strProp: 'gamma', numProp: 7}), new Simple({strProp: 'alpha', numProp: 2})]], ]); @@ -140,7 +146,7 @@ describe('map of array dictionary shape', function () { prop: { one: [{strProp: 'delta', numProp: 4}], two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], - } + }, })); }); }); diff --git a/spec/onDeserialized.spec.ts b/spec/onDeserialized.spec.ts index ed57f48..cfb308c 100644 --- a/spec/onDeserialized.spec.ts +++ b/spec/onDeserialized.spec.ts @@ -1,10 +1,9 @@ -import { jsonObject, jsonMember, TypedJSON } from "../src/typedjson"; +import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -describe('onDeserialized', function () { - - it('should call the static method', function() { +describe('onDeserialized', () => { + it('should call the static method', () => { @jsonObject({ - onDeserialized: 'afterDeser' + onDeserialized: 'afterDeser', }) class Person { @jsonMember @@ -13,25 +12,25 @@ describe('onDeserialized', function () { @jsonMember age: number; - public static afterDeser() { + static afterDeser() { // should call } - public getDescription() { - return this.name + " is " + this.age + "y old"; + getDescription() { + return `${this.name} is ${this.age}y old`; } } spyOn(Person, 'afterDeser'); - const person = TypedJSON.parse({'name': 'John', age: 20}, Person)!; + const person = TypedJSON.parse({name: 'John', age: 20}, Person)!; expect(person instanceof Person).toBeTruthy(); expect(person.getDescription()).toEqual('John is 20y old'); expect(Person.afterDeser).toHaveBeenCalled(); }); - it('should call the member method', function() { + it('should call the member method', () => { @jsonObject({ - onDeserialized: 'afterDeser' + onDeserialized: 'afterDeser', }) class Person { @jsonMember @@ -44,24 +43,24 @@ describe('onDeserialized', function () { spyOn(this, 'afterDeser'); } - public afterDeser() { + afterDeser() { // should call } - public getDescription() { - return this.name + " is " + this.age + "y old"; + getDescription() { + return `${this.name} is ${this.age}y old`; } } - const person = TypedJSON.parse({'name': 'John', age: 20}, Person)!; + const person = TypedJSON.parse({name: 'John', age: 20}, Person)!; expect(person instanceof Person).toBeTruthy(); expect(person.getDescription()).toEqual('John is 20y old'); expect(person.afterDeser).toHaveBeenCalled(); }); - it('should prefer the member method when there are both', function() { + it('should prefer the member method when there are both', () => { @jsonObject({ - onDeserialized: 'afterDeser' + onDeserialized: 'afterDeser', }) class Person { @jsonMember @@ -70,7 +69,7 @@ describe('onDeserialized', function () { @jsonMember age: number; - public static afterDeser() { + static afterDeser() { // should NOT call } @@ -78,17 +77,17 @@ describe('onDeserialized', function () { spyOn(this, 'afterDeser'); } - public afterDeser() { + afterDeser() { // should call } - public getDescription() { - return this.name + " is " + this.age + "y old"; + getDescription() { + return `${this.name} is ${this.age}y old`; } } spyOn(Person, 'afterDeser'); - const person = TypedJSON.parse({'name': 'John', age: 20}, Person)!; + const person = TypedJSON.parse({name: 'John', age: 20}, Person)!; expect(person instanceof Person).toBeTruthy(); expect(person.getDescription()).toEqual('John is 20y old'); expect(person.afterDeser).toHaveBeenCalled(); diff --git a/spec/parse-to-object.spec.ts b/spec/parse-to-object.spec.ts index e16cbc5..ae008bd 100644 --- a/spec/parse-to-object.spec.ts +++ b/spec/parse-to-object.spec.ts @@ -1,7 +1,7 @@ -import { parseToJSObject } from '../src/typedjson/helpers'; +import {parseToJSObject} from '../src/typedjson/helpers'; -describe("parse To Object", function () { - it("should passthrough objects", function () { +describe('parse To Object', () => { + it('should passthrough objects', () => { const obj = { a: 1, b: 2, @@ -11,7 +11,7 @@ describe("parse To Object", function () { expect(obj2).toBe(obj); }); - it("should passthrough arrays", function () { + it('should passthrough arrays', () => { const arr = [{ a: 1, b: 2, @@ -21,7 +21,7 @@ describe("parse To Object", function () { expect(arr2).toBe(arr); }); - it("should parse object string", function () { + it('should parse object string', () => { const arr = { a: 1, b: 2, @@ -31,12 +31,12 @@ describe("parse To Object", function () { expect(arr2).toEqual(arr); }); - it("should passthrough primitives", function () { + it('should passthrough primitives', () => { expect(parseToJSObject(1, Number)).toBe(1); expect(parseToJSObject(false, Boolean)).toBe(false); }); - it("should parse strings with quotes, but passthrough other", function () { + it('should parse strings with quotes, but passthrough other', () => { // 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'); @@ -49,8 +49,8 @@ describe("parse To Object", function () { expect(parseToJSObject('畤慰', DataView)).toBe('畤慰'); }); - it("should passthrough builtins", function () { - const date = new Date; + it('should passthrough builtins', () => { + const date = new Date(); expect(parseToJSObject(date, Date)).toBe(date); const buffer = new ArrayBuffer(3); expect(parseToJSObject(buffer, ArrayBuffer)).toBe(buffer); diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 69a82d0..2a7cc85 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -1,7 +1,7 @@ -import {isEqual} from "./utils/object-compare"; -import {TypedJSON, jsonObject, jsonMember, jsonArrayMember} from "../src/typedjson"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {isEqual} from './utils/object-compare'; -describe('polymorphic abstract classes', function() { +describe('polymorphic abstract classes', () => { abstract class Node { @jsonMember name: string; @@ -19,10 +19,10 @@ describe('polymorphic abstract classes', function() { @jsonObject class BigNode extends Node { @jsonArrayMember(String) - inputs: string[]; + inputs: Array; @jsonArrayMember(String) - outputs: string[]; + outputs: Array; constructor() { super(); @@ -32,11 +32,11 @@ describe('polymorphic abstract classes', function() { } @jsonObject({ - knownTypes: [BigNode, SmallNode] + knownTypes: [BigNode, SmallNode], }) class Graph { @jsonArrayMember(Node) - nodes: Node[]; + nodes: Array; @jsonMember root: Node; @@ -47,39 +47,39 @@ describe('polymorphic abstract classes', function() { } function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', ]; return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { - var graph = new Graph(); + const graph = new Graph(); - for (var i = 0; i < 20; i++) { + for (let i = 0; i < 20; i++) { let node: Node; if (Math.random() < 0.25) { - let bigNode = new BigNode(); + const bigNode = new BigNode(); bigNode.inputs = [ randPortType(), randPortType(), - randPortType() + randPortType(), ]; bigNode.outputs = [ randPortType(), - randPortType() + randPortType(), ]; node = bigNode; } else { - let smallNode = new SmallNode(); + const smallNode = new SmallNode(); smallNode.inputType = randPortType(); smallNode.outputType = randPortType(); @@ -96,21 +96,21 @@ describe('polymorphic abstract classes', function() { } } - var json = TypedJSON.stringify(graph, Graph); - var clone = TypedJSON.parse(json, Graph); + const json = TypedJSON.stringify(graph, Graph); + const clone = TypedJSON.parse(json, Graph); if (log) { - console.log("Test: polymorphism with abstract property types..."); + console.log('Test: polymorphism with abstract property types...'); console.log(graph); console.log(JSON.parse(json)); console.log(clone); - console.log("Test finished."); + console.log('Test finished.'); } return isEqual(graph, clone); } - it('should work', function () { + it('should work', () => { expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 4c261c2..2821dcd 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -1,14 +1,14 @@ -import { isEqual } from "./utils/object-compare"; -import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from "../src/typedjson"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {isEqual} from './utils/object-compare'; -describe('polymorphic custom names', function() { +describe('polymorphic custom names', () => { @jsonObject class Person { - @jsonMember({ name: "first-name" }) - public firstName: string; + @jsonMember({name: 'first-name'}) + firstName: string; - @jsonMember({ name: "last-name" }) - public lastName: string; + @jsonMember({name: 'last-name'}) + lastName: string; constructor(); constructor(firstName: string, lastName: string); @@ -23,10 +23,10 @@ describe('polymorphic custom names', function() { @jsonObject class Employee extends Person { @jsonMember - public salary: number; + salary: number; @jsonMember - public joined: Date; + joined: Date; constructor(); constructor(firstName: string, lastName: string); @@ -41,16 +41,16 @@ describe('polymorphic custom names', function() { } } - @jsonObject({ name: "part-time-employee" }) + @jsonObject({name: 'part-time-employee'}) class PartTimeEmployee extends Employee { - @jsonMember({ name: "work-hours" }) - public workHours: number; + @jsonMember({name: 'work-hours'}) + workHours: number; } @jsonObject() class Investor extends Person { - @jsonMember({ name: "invest-amount" }) - public investAmount: number; + @jsonMember({name: 'invest-amount'}) + investAmount: number; constructor(); constructor(firstName: string, lastName: string); @@ -62,16 +62,16 @@ describe('polymorphic custom names', function() { } } - @jsonObject({ name: "company", knownTypes: [PartTimeEmployee, Investor] }) + @jsonObject({name: 'company', knownTypes: [PartTimeEmployee, Investor]}) class Company { @jsonMember - public name: string; + name: string; - @jsonArrayMember(Employee, { name: 'company-employees' }) - public employees: Array; + @jsonArrayMember(Employee, {name: 'company-employees'}) + employees: Array; @jsonMember - public owner: Person; + owner: Person; constructor() { this.employees = []; @@ -80,36 +80,36 @@ describe('polymorphic custom names', function() { function test(log: boolean) { // Create a Company. - var company = new Company(); - company.name = "Json Types"; + const company = new Company(); + company.name = 'Json Types'; switch (Math.floor(Math.random() * 4)) { case 0: - company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); + company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); break; case 1: - company.owner = new Investor("John", "White", 1700000); + company.owner = new Investor('John', 'White', 1700000); break; case 2: - company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); + company.owner = new PartTimeEmployee('John', 'White', 160000, new Date(1992, 5, 27)); (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); break; default: - company.owner = new Person("John", "White"); + company.owner = new Person('John', 'White'); break; } // Add employees. - for (var j = 0; j < 20; j++) { + for (let j = 0; j < 20; j++) { if (Math.random() < 0.2) { - var newPartTimeEmployee = new PartTimeEmployee( + const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) + new Date(Date.now() - Math.floor(Math.random() * 80000)), ); newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); @@ -120,26 +120,26 @@ describe('polymorphic custom names', function() { `firstname_${j}`, `lastname_${j}`, Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) + new Date(Date.now() - Math.floor(Math.random() * 80000)), )); } } - var json = TypedJSON.stringify(company, Company); - var reparsed = TypedJSON.parse(json, Company); + const json = TypedJSON.stringify(company, Company); + const reparsed = TypedJSON.parse(json, Company); if (log) { - console.log("Test: polymorphism with custom names..."); + console.log('Test: polymorphism with custom names...'); console.log(company); console.log(JSON.parse(json)); console.log(reparsed); - console.log("Test finished."); + console.log('Test finished.'); } return isEqual(company, reparsed); } - it('should work', function () { + it('should work', () => { expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index b0ad2db..f3bbe0b 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -1,29 +1,26 @@ -import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from "../src/typedjson"; -import { IndexedObject } from '../src/typedjson/types'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {IndexedObject} from '../src/typedjson/types'; -describe('polymorphism custom type hints', function () { - - describe('should work for a base class', function () { +describe('polymorphism custom type hints', () => { + describe('should work for a base class', () => { let TYPE_MAP: IndexedObject; @jsonObject({ - typeHintEmitter: (targetObject, sourceObject) => targetObject.personType = sourceObject.constructor.name + 'Type', + typeHintEmitter: (targetObject, sourceObject) => targetObject.personType = `${sourceObject.constructor.name}Type`, typeResolver: sourceObject => TYPE_MAP[sourceObject.personType], }) - abstract class Person - { + abstract class Person { @jsonMember - public firstName: string; + firstName: string; @jsonMember - public lastName: string; + lastName: string; constructor(); constructor(firstName?: string, lastName?: string); constructor(firstName: string, lastName: string); constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) - { + if (firstName && lastName) { this.firstName = firstName; this.lastName = lastName; } @@ -31,10 +28,9 @@ describe('polymorphism custom type hints', function () { } @jsonObject - class Employee extends Person - { + class Employee extends Person { @jsonMember - public salary: number; + salary: number; constructor(); constructor(firstName: string, lastName: string); @@ -42,25 +38,22 @@ describe('polymorphism custom type hints', function () { constructor(firstName?: string, lastName?: string, salary?: number) { super(firstName, lastName); - if (salary) - { + if (salary) { this.salary = salary; } } } @jsonObject - class PartTimeEmployee extends Employee - { + class PartTimeEmployee extends Employee { @jsonMember - public workHours: number; + workHours: number; } @jsonObject - class Investor extends Person - { + class Investor extends Person { @jsonMember - public investAmount: number; + investAmount: number; constructor(); constructor(firstName: string, lastName: string); @@ -73,35 +66,34 @@ describe('polymorphism custom type hints', function () { } TYPE_MAP = { - 'EmployeeType': Employee, - 'PartTimeEmployeeType': PartTimeEmployee, - 'InvestorType': Investor, - } + EmployeeType: Employee, + PartTimeEmployeeType: PartTimeEmployee, + InvestorType: Investor, + }; @jsonObject - class Company - { + class Company { @jsonMember - public name: string; + name: string; @jsonArrayMember(Employee) - public employees: Array = []; + employees: Array = []; @jsonMember - public owner: Person; + owner: Person; } - it('should emit custom hint', function () { + it('should emit custom hint', () => { const company = new Company(); - company.name = "Json Types"; - company.owner = new Investor("John", "White", 1700000); + company.name = 'Json Types'; + company.owner = new Investor('John', 'White', 1700000); - const partTime = new PartTimeEmployee("Abe", "White", 160000); + const partTime = new PartTimeEmployee('Abe', 'White', 160000); partTime.workHours = 20; company.employees = [ - new Employee("Donn", "Worker", 240000), + new Employee('Donn', 'Worker', 240000), partTime, - new Employee("Smith", "Elly", 35500), + new Employee('Smith', 'Elly', 35500), ]; const json = TypedJSON.toPlainJson(company, Company); @@ -122,7 +114,7 @@ describe('polymorphism custom type hints', function () { }); }); - it('should resolve custom hints', function () { + it('should resolve custom hints', () => { const json = { name: 'Json Types', owner: {personType: 'InvestorType', firstName: 'John', lastName: 'White', investAmount: 1700000}, @@ -142,48 +134,44 @@ describe('polymorphism custom type hints', function () { const deserialized = TypedJSON.parse(JSON.stringify(json), Company); const company = new Company(); - company.name = "Json Types"; - company.owner = new Investor("John", "White", 1700000); + company.name = 'Json Types'; + company.owner = new Investor('John', 'White', 1700000); - const partTime = new PartTimeEmployee("Abe", "White", 160000); + const partTime = new PartTimeEmployee('Abe', 'White', 160000); partTime.workHours = 20; company.employees = [ - new Employee("Donn", "Worker", 240000), + new Employee('Donn', 'Worker', 240000), partTime, - new Employee("Smith", "Elly", 35500), + new Employee('Smith', 'Elly', 35500), ]; expect(deserialized).toEqual(company); }); }); - describe('should override parents', function () { - abstract class StructuralBase - { + describe('should override parents', () => { + abstract class StructuralBase { @jsonMember value: string; } @jsonObject({ typeHintEmitter: (targetObject, sourceObject) => targetObject.type = (sourceObject.constructor as any).type, - typeResolver: (sourceObject => sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne), + typeResolver: sourceObject => sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne, }) - abstract class SemanticBaseOne extends StructuralBase - { + abstract class SemanticBaseOne extends StructuralBase { @jsonMember prop1: number; } @jsonObject - class ConcreteOne extends SemanticBaseOne - { + class ConcreteOne extends SemanticBaseOne { static type = 'sub-one'; @jsonMember propSub: string; } @jsonObject - class AnotherConcreteOne extends SemanticBaseOne - { + class AnotherConcreteOne extends SemanticBaseOne { static type = 'sub-two'; @jsonMember propSub: number; @@ -191,30 +179,27 @@ describe('polymorphism custom type hints', function () { @jsonObject({ typeHintEmitter: (targetObject, sourceObject) => targetObject.hint = sourceObject instanceof ConcreteTwo ? 'first' : 'another', - typeResolver: (sourceObject => sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo), + typeResolver: sourceObject => sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo, }) - abstract class SemanticBaseTwo extends StructuralBase - { + abstract class SemanticBaseTwo extends StructuralBase { @jsonMember prop2: number; } @jsonObject - class ConcreteTwo extends SemanticBaseTwo - { + class ConcreteTwo extends SemanticBaseTwo { @jsonMember propSub: string; } @jsonObject - class AnotherConcreteTwo extends SemanticBaseTwo - { + class AnotherConcreteTwo extends SemanticBaseTwo { @jsonMember propSub: number; } - it('should work for SemanticBaseOne', function () { - const inputAndResult: [() => SemanticBaseOne, () => IndexedObject][] = [ + it('should work for SemanticBaseOne', () => { + const inputAndResult: Array<[() => SemanticBaseOne, () => IndexedObject]> = [ [ () => { const expected = new ConcreteOne(); @@ -250,11 +235,11 @@ describe('polymorphism custom type hints', function () { inputAndResult.forEach(([inputFn, serializedFn]) => { expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseOne)).toEqual(serializedFn()); expect(TypedJSON.parse(serializedFn(), SemanticBaseOne)).toEqual(inputFn()); - }) + }); }); - it('should work for SemanticBaseTwo', function () { - const inputAndResult: [() => SemanticBaseTwo, () => IndexedObject][] = [ + it('should work for SemanticBaseTwo', () => { + const inputAndResult: Array<[() => SemanticBaseTwo, () => IndexedObject]> = [ [ () => { const expected = new ConcreteTwo(); @@ -290,7 +275,7 @@ describe('polymorphism custom type hints', function () { inputAndResult.forEach(([inputFn, serializedFn]) => { expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseTwo)).toEqual(serializedFn()); expect(TypedJSON.parse(serializedFn(), SemanticBaseTwo)).toEqual(inputFn()); - }) + }); }); - }) + }); }); diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index 557b976..74b2759 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,8 +1,7 @@ -import {isEqual} from "./utils/object-compare"; -import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; - -describe('polymorphic interfaces', function() { +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {isEqual} from './utils/object-compare'; +describe('polymorphic interfaces', () => { interface Point { x: number; y: number; @@ -32,10 +31,10 @@ describe('polymorphic interfaces', function() { y: number; @jsonArrayMember(String) - inputs: string[]; + inputs: Array; @jsonArrayMember(String) - outputs: string[]; + outputs: Array; constructor() { this.inputs = []; @@ -44,11 +43,11 @@ describe('polymorphic interfaces', function() { } @jsonObject({ - knownTypes: [BigNode, SmallNode] + knownTypes: [BigNode, SmallNode], }) class GraphGrid { @jsonArrayMember(Object) - points: Point[]; + points: Array; @jsonMember root: Point; @@ -59,39 +58,39 @@ describe('polymorphic interfaces', function() { } function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', ]; return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { - var graph = new GraphGrid(); + const graph = new GraphGrid(); - for (var i = 0; i < 20; i++) { + for (let i = 0; i < 20; i++) { let point: Point; if (Math.random() < 0.25) { - let bigNode = new BigNode(); + const bigNode = new BigNode(); bigNode.inputs = [ randPortType(), randPortType(), - randPortType() + randPortType(), ]; bigNode.outputs = [ randPortType(), - randPortType() + randPortType(), ]; point = bigNode; } else { - let smallNode = new SmallNode(); + const smallNode = new SmallNode(); smallNode.inputType = randPortType(); smallNode.outputType = randPortType(); @@ -109,21 +108,21 @@ describe('polymorphic interfaces', function() { } } - var json = TypedJSON.stringify(graph, GraphGrid); - var clone = TypedJSON.parse(json, GraphGrid); + const json = TypedJSON.stringify(graph, GraphGrid); + const clone = TypedJSON.parse(json, GraphGrid); if (log) { - console.log("Test: polymorphism with interface property types..."); + console.log('Test: polymorphism with interface property types...'); console.log(graph); console.log(JSON.parse(json)); console.log(clone); - console.log("Test finished."); + console.log('Test finished.'); } return isEqual(graph, clone); } - it('should work', function () { + it('should work', () => { expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index d9e2ea0..24770d9 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -1,8 +1,7 @@ -import {isEqual} from "./utils/object-compare"; -import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; - -describe('polymorphism in nested arrays', function() { +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {isEqual} from './utils/object-compare'; +describe('polymorphism in nested arrays', () => { abstract class Node { @jsonMember name: string; @@ -20,10 +19,10 @@ describe('polymorphism in nested arrays', function() { @jsonObject class BigNode extends Node { @jsonArrayMember(String) - inputs: string[]; + inputs: Array; @jsonArrayMember(String) - outputs: string[]; + outputs: Array; constructor() { super(); @@ -32,7 +31,7 @@ describe('polymorphism in nested arrays', function() { } } - @jsonObject({ knownTypes: [BigNode, SmallNode] }) + @jsonObject({knownTypes: [BigNode, SmallNode]}) class Graph { @jsonArrayMember(Node, {dimensions: 2}) items: Array>; @@ -47,25 +46,25 @@ describe('polymorphism in nested arrays', function() { } function randPortType() { - var types = [ - "string", - "integer", - "float", - "boolean", - "void" + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', ]; return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { - var graph = new Graph(); + const graph = new Graph(); for (var i = 0; i < 20; i++) { graph.smallItems.push([]); for (var j = 0; j < 8; j++) { - let node = new SmallNode(); + const node = new SmallNode(); node.name = `smallnode_${i}_${j}`; node.inputType = randPortType(); @@ -82,21 +81,21 @@ describe('polymorphism in nested arrays', function() { let node: Node; if (Math.random() < 0.25) { - let bigNode = new BigNode(); + const bigNode = new BigNode(); bigNode.inputs = [ randPortType(), randPortType(), - randPortType() + randPortType(), ]; bigNode.outputs = [ randPortType(), - randPortType() + randPortType(), ]; node = bigNode; } else { - let smallNode = new SmallNode(); + const smallNode = new SmallNode(); smallNode.inputType = randPortType(); smallNode.outputType = randPortType(); @@ -110,25 +109,25 @@ describe('polymorphism in nested arrays', function() { } } - var json = TypedJSON.stringify(graph, Graph); + const json = TypedJSON.stringify(graph, Graph); if (log) { - console.log("Test: polymorphism with nested arrays..."); + console.log('Test: polymorphism with nested arrays...'); console.log(graph); console.log(JSON.parse(json)); } - var clone = TypedJSON.parse(json, Graph); + const clone = TypedJSON.parse(json, Graph); if (log) { console.log(clone); - console.log("Test finished."); + console.log('Test finished.'); } return isEqual(graph, clone); } - it('should work', function () { + it('should work', () => { expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/polymorphism-root-abstract-class.spec.ts b/spec/polymorphism-root-abstract-class.spec.ts index df8ffbb..8b14fd2 100644 --- a/spec/polymorphism-root-abstract-class.spec.ts +++ b/spec/polymorphism-root-abstract-class.spec.ts @@ -1,7 +1,6 @@ -import { jsonObject, jsonMember, TypedJSON } from "../src/typedjson"; - -describe('single class', function () { +import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +describe('single class', () => { abstract class Person { @jsonMember firstName?: string; @@ -9,8 +8,8 @@ describe('single class', function () { @jsonMember lastName?: string; - public getFullName() { - return this.firstName + " " + this.lastName; + getFullName() { + return `${this.firstName} ${this.lastName}`; } } @@ -19,15 +18,15 @@ describe('single class', function () { @jsonMember pounds?: number; - public getFullName() { - return super.getFullName() + ` weighing ${this.pounds}`; + getFullName() { + return `${super.getFullName()} weighing ${this.pounds}`; } } // todo we need something better - jsonObject({ knownTypes: [Bob]})(Person); + jsonObject({knownTypes: [Bob]})(Person); - describe('deserialized', function () { + describe('deserialized', () => { beforeAll(function () { this.person = TypedJSON.parse('{ "__type": "Bob", "firstName": "John", "lastName": "Doe", "pounds": 40 }', Person); }); @@ -42,9 +41,9 @@ describe('single class', function () { }); }); - describe('serialized', function () { - it('should contain all data', function () { - const person = new Bob; + describe('serialized', () => { + it('should contain all data', () => { + const person = new Bob(); person.firstName = 'John'; person.lastName = 'Doe'; person.pounds = 30; diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 82b748d..0642a76 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -1,14 +1,14 @@ -import {isEqual} from "./utils/object-compare"; -import {jsonObject, jsonMember, jsonArrayMember, TypedJSON} from "../src/typedjson"; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {isEqual} from './utils/object-compare'; -describe('polymorphism', function() { +describe('polymorphism', () => { @jsonObject class Person { @jsonMember - public firstName: string; + firstName: string; @jsonMember - public lastName: string; + lastName: string; constructor(); constructor(firstName: string, lastName: string); @@ -23,10 +23,10 @@ describe('polymorphism', function() { @jsonObject class Employee extends Person { @jsonMember - public salary: number; + salary: number; @jsonMember - public joined: Date; + joined: Date; constructor(); constructor(firstName: string, lastName: string); @@ -44,13 +44,13 @@ describe('polymorphism', function() { @jsonObject class PartTimeEmployee extends Employee { @jsonMember - public workHours: number; + workHours: number; } @jsonObject class Investor extends Person { @jsonMember - public investAmount: number; + investAmount: number; constructor(); constructor(firstName: string, lastName: string); @@ -62,16 +62,16 @@ describe('polymorphism', function() { } } - @jsonObject({ knownTypes: [PartTimeEmployee, Investor] }) + @jsonObject({knownTypes: [PartTimeEmployee, Investor]}) class Company { @jsonMember - public name: string; + name: string; @jsonArrayMember(Employee) - public employees: Array; + employees: Array; @jsonMember - public owner: Person; + owner: Person; constructor() { this.employees = []; @@ -80,36 +80,36 @@ describe('polymorphism', function() { function test(log: boolean) { // Create a Company. - var company = new Company(); - company.name = "Json Types"; + const company = new Company(); + company.name = 'Json Types'; switch (Math.floor(Math.random() * 4)) { case 0: - company.owner = new Employee("John", "White", 240000, new Date(1992, 5, 27)); + company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); break; case 1: - company.owner = new Investor("John", "White", 1700000); + company.owner = new Investor('John', 'White', 1700000); break; case 2: - company.owner = new PartTimeEmployee("John", "White", 160000, new Date(1992, 5, 27)); + company.owner = new PartTimeEmployee('John', 'White', 160000, new Date(1992, 5, 27)); (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); break; default: - company.owner = new Person("John", "White"); + company.owner = new Person('John', 'White'); break; } // Add employees. - for (var j = 0; j < 20; j++) { + for (let j = 0; j < 20; j++) { if (Math.random() < 0.2) { - var newPartTimeEmployee = new PartTimeEmployee( + const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) + new Date(Date.now() - Math.floor(Math.random() * 80000)), ); newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); @@ -120,26 +120,26 @@ describe('polymorphism', function() { `firstname_${j}`, `lastname_${j}`, Math.floor(Math.random() * 80000), - new Date(Date.now() - Math.floor(Math.random() * 80000)) + new Date(Date.now() - Math.floor(Math.random() * 80000)), )); } } - var json = TypedJSON.stringify(company, Company); - var reparsed = TypedJSON.parse(json, Company); + const json = TypedJSON.stringify(company, Company); + const reparsed = TypedJSON.parse(json, Company); if (log) { - console.log("Test: polymorphism..."); + console.log('Test: polymorphism...'); console.log(company); console.log(JSON.parse(json)); console.log(reparsed); - console.log("Test finished."); + console.log('Test finished.'); } return isEqual(company, reparsed); } - it('should work', function () { + it('should work', () => { expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/preserveNull.spec.ts b/spec/preserveNull.spec.ts index 803e69c..61a85c2 100644 --- a/spec/preserveNull.spec.ts +++ b/spec/preserveNull.spec.ts @@ -1,17 +1,16 @@ -import { jsonObject, jsonMember, TypedJSON, jsonArrayMember, jsonMapMember } from "../src/typedjson"; +import {jsonArrayMember, jsonMapMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -describe('preserveNull', function () { - - it('should work globally', function() { +describe('preserveNull', () => { + it('should work globally', () => { TypedJSON.setGlobalConfig({preserveNull: true}); @jsonObject class Person { @jsonMember - name: string|null; + name: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person); expect(json).toEqual({name: null}); @@ -23,14 +22,14 @@ describe('preserveNull', function () { delete TypedJSON._globalConfig; }); - it('should work in settings', function() { + it('should work in settings', () => { @jsonObject class Person { @jsonMember - name: string|null; + name: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person, {preserveNull: true}); expect(json).toEqual({name: null}); @@ -39,14 +38,14 @@ describe('preserveNull', function () { expect(obj).toEqual(input); }); - it('should work on class', function() { + it('should work on class', () => { @jsonObject({preserveNull: true}) class Person { @jsonMember - name: string|null; + name: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person); expect(json).toEqual({name: null}); @@ -55,14 +54,14 @@ describe('preserveNull', function () { expect(obj).toEqual(input); }); - it('should work on member', function() { + it('should work on member', () => { @jsonObject class Person { @jsonMember({preserveNull: true}) - name: string|null; + name: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person); expect(json).toEqual({name: null}); @@ -71,112 +70,112 @@ describe('preserveNull', function () { expect(obj).toEqual(input); }); - it('should override parser when more specific', function() { + it('should override parser when more specific', () => { @jsonObject class Person { @jsonMember({preserveNull: false}) - name?: string|null; + name?: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person, {preserveNull: true}); expect(json).toEqual({}); const obj = TypedJSON.parse({name: null}, Person, {preserveNull: true}); - expect(obj).toEqual(new Person); + expect(obj).toEqual(new Person()); }); - it('should override class when more specific', function() { + it('should override class when more specific', () => { @jsonObject({preserveNull: true}) class Person { @jsonMember({preserveNull: false}) - name?: string|null; + name?: string | null; } - const input = new Person; + const input = new Person(); input.name = null; const json = TypedJSON.toPlainJson(input, Person); expect(json).toEqual({}); const obj = TypedJSON.parse({name: null}, Person); - expect(obj).toEqual(new Person); + expect(obj).toEqual(new Person()); }); - it('should not affect other properties', function() { + it('should not affect other properties', () => { @jsonObject class Person { @jsonMember({preserveNull: true}) - name: string|null; + name: string | null; @jsonMember - age: number|null; + age: number | null; } - const input = new Person; + const input = new Person(); input.name = null; input.age = null; const json = TypedJSON.stringify(input, Person); expect(json).toEqual('{"name":null}'); const obj = TypedJSON.parse({name: null, age: null}, Person); - const expected = new Person; + const expected = new Person(); expected.name = null; expect(obj).toEqual(expected); }); - it('should not affect inner jsonObjects when set from parent jsonObject', function() { + it('should not affect inner jsonObjects when set from parent jsonObject', () => { @jsonObject class Inner { @jsonMember - prop: string|null; + prop: string | null; } @jsonObject({preserveNull: true}) class Person { @jsonMember - name: string|null; + name: string | null; @jsonMember - inn: Inner = new Inner; + inn: Inner = new Inner(); } - const input = new Person; + const input = new Person(); input.name = null; input.inn.prop = null; const json = TypedJSON.stringify(input, Person); expect(json).toEqual('{"name":null,"inn":{}}'); const obj = TypedJSON.parse({name: null, inn: {prop: null}}, Person); - const expected = new Person; + const expected = new Person(); expected.name = null; expect(obj).toEqual(expected); }); - it('should preserve nulls in array', function() { + it('should preserve nulls in array', () => { @jsonObject class Person { @jsonArrayMember(String, {preserveNull: true}) - names: (string|null)[]; + names: Array; } const input = new Person(); input.names = [null, 'one', null, null, 'two', null]; const json = TypedJSON.stringify(input, Person); expect(json).toEqual('{"names":[null,"one",null,null,"two",null]}'); - const obj = TypedJSON.parse({names: [null,'one',null,null,'two',null]}, Person); + const obj = TypedJSON.parse({names: [null, 'one', null, null, 'two', null]}, Person); expect(obj).toEqual(input); }); - it('should preserve nulls in maps', function() { + it('should preserve nulls in maps', () => { @jsonObject class Person { @jsonMapMember(String, String, {preserveNull: true}) - map: Map; + map: Map; } const input = new Person(); - input.map = new Map([ + input.map = new Map([ ['one', null], ['two', null], ['three', 'val'], @@ -186,7 +185,7 @@ describe('preserveNull', function () { '{"map":[{"key":"one","value":null},{"key":"two","value":null},{"key":"three","value":"val"}]}', ); const obj = TypedJSON.parse( - {'map':[{'key':'one','value':null},{'key':'two','value':null},{'key':'three','value':'val'}]}, + {map: [{key: 'one', value: null}, {key: 'two', value: null}, {key: 'three', value: 'val'}]}, Person, ); expect(obj).toEqual(input); diff --git a/spec/set.spec.ts b/spec/set.spec.ts index 2b8d2e1..b5335da 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,7 +1,7 @@ -import { ArrayT, SetT, jsonObject, jsonMember, TypedJSON, jsonSetMember } from "../src/typedjson"; -import { Everything } from "./utils/everything"; +import {ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src/typedjson'; +import {Everything} from './utils/everything'; -describe('set of objects', function () { +describe('set of objects', () => { @jsonObject class Simple { @jsonMember @@ -10,32 +10,32 @@ describe('set of objects', function () { @jsonMember numProp: number; - constructor(init: { strProp: string, numProp: number }) + constructor(init: { strProp: string; numProp: number }) constructor() - constructor(init?: { strProp: string, numProp: number }) { + constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; } } - public foo() { + foo() { return `${this.strProp}-${this.numProp}`; } } - it('deserializes empty set', function () { + it('deserializes empty set', () => { const result = TypedJSON.parseAsSet('[]', Simple); expect(result).toBeDefined(); expect(result.size).toBe(0); }); - it('serialized empty set', function () { + it('serialized empty set', () => { const result = TypedJSON.stringifyAsSet(new Set(), Simple); expect(result).toBe('[]'); }); - it('deserialized should be of proper type', function () { + it('deserialized should be of proper type', () => { const expectation = [ {strProp: 'delta', numProp: 4}, {strProp: 'bravo', numProp: 2}, @@ -51,7 +51,7 @@ describe('set of objects', function () { }); }); - it('serialized should contain all elements', function () { + it('serialized should contain all elements', () => { const expectation = [ {strProp: 'delta', numProp: 4}, {strProp: 'bravo', numProp: 2}, @@ -64,18 +64,18 @@ describe('set of objects', function () { }); }); -describe('set member', function () { +describe('set member', () => { @jsonObject class WithSet { @jsonSetMember(Everything) prop: Set; - public getSetSize() { + getSetSize() { return this.prop.size; } } - it('deserializes', function () { + it('deserializes', () => { const result = TypedJSON.parse(JSON.stringify({prop: [Everything.create(), Everything.create()]}), WithSet); expect(result).toBeInstanceOf(WithSet); @@ -86,7 +86,7 @@ describe('set member', function () { expect(Array.from(result.prop)).toEqual([Everything.expected(), Everything.expected()]); }); - it('serializes', function () { + it('serializes', () => { const object = new WithSet(); object.prop = new Set([Everything.expected(), Everything.expected()]); const result = TypedJSON.stringify(object, WithSet); @@ -95,7 +95,7 @@ describe('set member', function () { }); }); -describe('set array member', function () { +describe('set array member', () => { @jsonObject class Simple { @jsonMember @@ -104,16 +104,16 @@ describe('set array member', function () { @jsonMember numProp: number; - constructor(init: { strProp: string, numProp: number }) + constructor(init: { strProp: string; numProp: number }) constructor() - constructor(init?: { strProp: string, numProp: number }) { + constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; } } - public foo() { + foo() { return `${this.strProp}-${this.numProp}`; } } @@ -121,16 +121,18 @@ describe('set array member', function () { @jsonObject class WithSet { @jsonMember({constructor: SetT(ArrayT(Simple))}) - prop: Set; + prop: Set>; - public getSetSize() { + getSetSize() { return this.prop.size; } } - it('deserializes', function () { - const result = TypedJSON.parse(JSON.stringify( - {prop: [ + it('deserializes', () => { + const result = TypedJSON.parse( +JSON.stringify( + { +prop: [ [ {strProp: 'delta', numProp: 4}, {strProp: 'bravo', numProp: 2}, @@ -139,10 +141,12 @@ describe('set array member', function () { [ {strProp: 'alpha', numProp: 3245}, {strProp: 'zeta', numProp: 4358}, - ] - ] - }), - WithSet); + ], + ], + }, +), + WithSet, +); expect(result).toBeInstanceOf(WithSet); expect(result.prop).toBeDefined(); @@ -156,12 +160,12 @@ describe('set array member', function () { new Simple({strProp: 'gamma', numProp: 0}), ], [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], - ]) + ]); }); - it('serializes', function () { + it('serializes', () => { const object = new WithSet(); - object.prop = new Set([ + object.prop = new Set>([ [new Simple({strProp: 'delta', numProp: 4})], [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], ]); @@ -171,7 +175,7 @@ describe('set array member', function () { }); }); -describe('set of raw objects', function () { +describe('set of raw objects', () => { @jsonObject class WithRawSet { @jsonSetMember(Object) @@ -181,22 +185,22 @@ describe('set of raw objects', function () { function rawObjects() { return [ { - "prop": "something", + prop: 'something', }, { - "another": "value", + another: 'value', }, ]; } - it('should deserialize as is', function () { - const withRawSet = TypedJSON.parse({"rawSet": rawObjects()}, WithRawSet); + it('should deserialize as is', () => { + const withRawSet = TypedJSON.parse({rawSet: rawObjects()}, WithRawSet); expect(withRawSet).toBeDefined(); expect(withRawSet instanceof WithRawSet).toBeTruthy(); expect(withRawSet.rawSet).toEqual(new Set(rawObjects())); }); - it('should serialize as is', function () { + it('should serialize as is', () => { const withRawSet = new WithRawSet(); withRawSet.rawSet = new Set(rawObjects()); const json = TypedJSON.toPlainJson(withRawSet, WithRawSet); diff --git a/spec/to-json.spec.ts b/spec/to-json.spec.ts index 6800add..80574eb 100644 --- a/spec/to-json.spec.ts +++ b/spec/to-json.spec.ts @@ -1,7 +1,7 @@ -import {jsonObject, jsonMember, toJson} from "../src/typedjson"; +import {jsonMember, jsonObject, toJson} from '../src/typedjson'; -describe('toJson decorator', function () { - it('should work with JSON.stringify', function () { +describe('toJson decorator', () => { + it('should work with JSON.stringify', () => { @toJson @jsonObject class Person { @@ -10,18 +10,18 @@ describe('toJson decorator', function () { @jsonMember({name: 'surname'}) lastName?: string; - public getFullName() { - return this.firstName + " " + this.lastName; + getFullName() { + return `${this.firstName} ${this.lastName}`; } } - const person = new Person; + const person = new Person(); person.firstName = 'John'; person.lastName = 'Doe'; expect(JSON.stringify(person)).toBe('{"surname":"Doe"}'); }); - it('should work on the abstract class', function () { + it('should work on the abstract class', () => { @toJson abstract class Base { @jsonMember({name: 'renamed'}) @@ -41,20 +41,19 @@ describe('toJson decorator', function () { ignored?: string; } - - const sub = new Sub; + const sub = new Sub(); sub.prop = 'value'; sub.num = 20; expect(JSON.stringify(sub)).toBe('{"renamed":"value","numeric":20}'); - const otherSub = new OtherSub; + const otherSub = new OtherSub(); otherSub.prop = 'value'; otherSub.decimal = 123; otherSub.ignored = 'assigned'; expect(JSON.stringify(otherSub)).toBe('{"renamed":"value","decimal":123}'); }); - it("should throw an error when toJSON already exists", function () { + it('should throw an error when toJSON already exists', () => { try { @toJson @jsonObject @@ -67,7 +66,7 @@ describe('toJson decorator', function () { } } - const some = new Some; + const some = new Some(); some.prop = 'value'; expect(JSON.stringify(some)).toBe('{}'); @@ -77,8 +76,7 @@ describe('toJson decorator', function () { } }); - - it("should overwrite toJSON when overwrite is true", function () { + it('should overwrite toJSON when overwrite is true', () => { @toJson({overwrite: true}) @jsonObject class Some { @@ -90,7 +88,7 @@ describe('toJson decorator', function () { } } - const some = new Some; + const some = new Some(); some.prop = 'value'; expect(JSON.stringify(some)).toBe('{"prop":"value"}'); }); diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index 637a831..84c7653 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -1,4 +1,4 @@ -import { jsonObject, jsonMember } from "../../src/typedjson"; +import {jsonMember, jsonObject} from '../../src/typedjson'; export enum JustEnum { One, @@ -46,7 +46,7 @@ export interface IEverything { // nullable is not supported, use optional instead // nullable: {}|null; optional?: {}; - undefinable: {}|undefined; + undefinable: {} | undefined; enum: JustEnum; constEnum: ConstEnum; strEnum: StrEnum; @@ -104,7 +104,7 @@ export class Everything implements IEverything { @jsonMember optional?: {}; @jsonMember - undefinable: {}|undefined; + undefinable: {} | undefined; @jsonMember enum: JustEnum; @jsonMember diff --git a/spec/utils/object-compare.ts b/spec/utils/object-compare.ts index 6d6dbf2..24800f1 100644 --- a/spec/utils/object-compare.ts +++ b/spec/utils/object-compare.ts @@ -1,8 +1,8 @@ -export function isEqual(a: Object, b: Object): boolean; +export function isEqual(a: Object, b: Object): boolean; export function isEqual(a: T, b: T): boolean; -export function isEqual(a: Array < T >, b: Array): boolean; +export function isEqual(a: Array, b: Array): boolean; export function isEqual(a: any, b: any): boolean { - if (typeof a === "object") { + if (typeof a === 'object') { if (Object.keys(a).length !== Object.keys(b).length) { // 'b' has a different number of properties, and thus can no longer be considered equal. console.warn(`Property count mismatch (a: ${Object.keys(a).length} keys, b: ${Object.keys(b).length} keys) on:`); @@ -12,7 +12,7 @@ export function isEqual(a: any, b: any): boolean { } else { // Alphabetical iteration over object property keys. return Object.keys(a).sort().reduce((acc, k) => { - if (typeof a[k] === "function" && typeof b[k] === "function") { + if (typeof a[k] === 'function' && typeof b[k] === 'function') { return true; } else { return acc && isEqual(a[k], b[k]); @@ -28,20 +28,18 @@ export function isEqual(a: any, b: any): boolean { return false; } else { // Compare all Array elements recursively. - for (var i = 0; i < a.length; i++) { + for (let i = 0; i < a.length; i++) { if (!isEqual(a[i], b[i])) { // Array elements not equal. return false; } } } + } else if (a !== b) { + console.warn(`Value mismatch (a: '${a}', b: '${b}').`); + return false; } else { - if (a !== b) { - console.warn(`Value mismatch (a: '${a}', b: '${b}').`); - return false; - } else { - return true; - } + return true; } return false; } diff --git a/src/parser.ts b/src/parser.ts index 5175d91..8b91a84 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,17 +1,16 @@ -import { Constructor, IndexedObject, Serializable } from "./typedjson/types"; -import { Serializer, defaultTypeEmitter } from "./typedjson/serializer"; -import { Deserializer, defaultTypeResolver } from "./typedjson/deserializer"; -import { JsonObjectMetadata, TypeResolver, TypeHintEmitter } from "./typedjson/metadata"; -import { logError, logWarning, nameof, parseToJSObject } from "./typedjson/helpers"; -import { extractOptionBase, OptionsBase } from "./typedjson/options-base"; -import { createArrayType } from "./typedjson/json-array-member"; -import { ensureTypeDescriptor, MapT, SetT } from './typedjson/type-descriptor'; +import {defaultTypeResolver, Deserializer} from './typedjson/deserializer'; +import {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers'; +import {createArrayType} from './typedjson/json-array-member'; +import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata'; +import {extractOptionBase, OptionsBase} from './typedjson/options-base'; +import {defaultTypeEmitter, Serializer} from './typedjson/serializer'; +import {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor'; +import {Constructor, IndexedObject, Serializable} from './typedjson/types'; export type JsonTypes = Object | boolean | string | number | null | undefined; -export { defaultTypeResolver, defaultTypeEmitter }; +export {defaultTypeResolver, defaultTypeEmitter}; -export interface ITypedJSONSettings extends OptionsBase -{ +export interface ITypedJSONSettings extends OptionsBase { /** * Sets the handler callback to invoke on errors during serializing and deserializing. * Re-throwing errors in this function will halt serialization/deserialization. @@ -48,61 +47,56 @@ export interface ITypedJSONSettings extends OptionsBase knownTypes?: Array>; } -export class TypedJSON -{ - //#region Static - public static parse( - object: any, rootType: Serializable, settings?: ITypedJSONSettings, - ): T|undefined { +export class TypedJSON { + // #region Static + static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined { return new TypedJSON(rootType, settings).parse(object); } - public static parseAsArray( + static parseAsArray( object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1 - ): T[]; - public static parseAsArray( + ): Array; + static parseAsArray( object: any, elementType: Serializable, - settings: ITypedJSONSettings|undefined, + settings: ITypedJSONSettings | undefined, dimensions: 2 - ): T[][]; - public static parseAsArray( + ): Array>; + static parseAsArray( object: any, elementType: Serializable, - settings: ITypedJSONSettings|undefined, + settings: ITypedJSONSettings | undefined, dimensions: 3 - ): T[][][]; - public static parseAsArray( + ): Array>>; + static parseAsArray( object: any, elementType: Serializable, - settings: ITypedJSONSettings|undefined, + settings: ITypedJSONSettings | undefined, dimensions: 4 - ): T[][][][]; - public static parseAsArray( + ): Array>>>; + static parseAsArray( object: any, elementType: Serializable, - settings: ITypedJSONSettings|undefined, + settings: ITypedJSONSettings | undefined, dimensions: 5 - ): T[][][][][]; - public static parseAsArray( + ): Array>>>>; + static parseAsArray( object: any, elementType: Serializable, settings?: ITypedJSONSettings, - dimensions?: number - ): any[] { + dimensions?: number, + ): Array { return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any); } - public static parseAsSet( - object: any, elementType: Serializable, settings?: ITypedJSONSettings, - ): Set { + static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set { return new TypedJSON(elementType, settings).parseAsSet(object); } - public static parseAsMap( + static parseAsMap( object: any, keyType: Serializable, valueType: Serializable, @@ -111,88 +105,76 @@ export class TypedJSON return new TypedJSON(valueType, settings).parseAsMap(object, keyType); } - public static toPlainJson( - object: T, rootType: Serializable, settings?: ITypedJSONSettings, - ): JsonTypes { + static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes { return new TypedJSON(rootType, settings).toPlainJson(object); } - public static toPlainArray( - object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, - ): Object[]; - public static toPlainArray( - object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, - ): Object[][]; - public static toPlainArray( - object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, - ): Object[][][]; - public static toPlainArray( - object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, - ): Object[][][][]; - public static toPlainArray( - object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, - ): Object[][][][][]; - public static toPlainArray( - object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, - ): any[]; - public static toPlainArray( - object: any[], elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings, - ): any[] { + static toPlainArray( + object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, + ): Array; + static toPlainArray( + object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, + ): Array>; + static toPlainArray( + object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, + ): Array>>; + static toPlainArray( + object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, + ): Array>>>; + static toPlainArray( + object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, + ): Array>>>>; + static toPlainArray( + object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, + ): Array; + static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array { return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); } - public static toPlainSet( - object: Set, elementType: Serializable, settings?: ITypedJSONSettings, - ): Object[]|undefined { + static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined { return new TypedJSON(elementType, settings).toPlainSet(object); } - public static toPlainMap( + static toPlainMap( object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings, - ): IndexedObject|{ key: any, value: any }[]|undefined { + ): IndexedObject | Array<{ key: any; value: any }> | undefined { return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); } - public static stringify( - object: T, rootType: Serializable, settings?: ITypedJSONSettings, - ): string { + static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string { return new TypedJSON(rootType, settings).stringify(object); } - public static stringifyAsArray( - object: T[], elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: T[][], elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: T[][][], elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: T[][][][], elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: T[][][][][], elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: any[], elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, + static stringifyAsArray( + object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, ): string; - public static stringifyAsArray( - object: any[], elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings, - ): string { + static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string { return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); } - public static stringifyAsSet( - object: Set, elementType: Serializable, settings?: ITypedJSONSettings, - ): string { + static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string { return new TypedJSON(elementType, settings).stringifyAsSet(object); } - public static stringifyAsMap( + static stringifyAsMap( object: Map, keyCtor: Serializable, valueCtor: Serializable, @@ -203,19 +185,15 @@ export class TypedJSON private static _globalConfig: ITypedJSONSettings; - public static setGlobalConfig(config: ITypedJSONSettings) - { - if (this._globalConfig) - { + static setGlobalConfig(config: ITypedJSONSettings) { + if (this._globalConfig) { Object.assign(this._globalConfig, config); - } - else - { + } else { this._globalConfig = config; } } - //#endregion + // #endregion private serializer: Serializer = new Serializer(); private deserializer: Deserializer = new Deserializer(); @@ -232,25 +210,20 @@ export class TypedJSON * @param rootConstructor The constructor of the root class type. * @param settings Additional configuration settings. */ - constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) - { - let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); + constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { + const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); - if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) - { - throw new TypeError("The TypedJSON root data type must have the @jsonObject decorator used."); + if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { + throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); } this.nameResolver = (ctor) => nameof(ctor); this.rootConstructor = rootConstructor; this.errorHandler = (error) => logError(error); - if (settings) - { + if (settings) { this.config(settings); - } - else if (TypedJSON._globalConfig) - { + } else if (TypedJSON._globalConfig) { this.config({}); } } @@ -259,17 +232,14 @@ export class TypedJSON * Configures TypedJSON through a settings object. * @param settings The configuration settings object. */ - public config(settings: ITypedJSONSettings) - { - if (TypedJSON._globalConfig) - { + config(settings: ITypedJSONSettings) { + if (TypedJSON._globalConfig) { settings = { ...TypedJSON._globalConfig, - ...settings + ...settings, }; - if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) - { + if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) { // Merge known-types (also de-duplicate them, so Array -> Set -> Array). settings.knownTypes = Array.from(new Set( settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes), @@ -281,35 +251,39 @@ export class TypedJSON this.serializer.options = options; this.deserializer.options = options; - if (settings.errorHandler) - { + if (settings.errorHandler) { this.errorHandler = settings.errorHandler; this.deserializer.setErrorHandler(settings.errorHandler); this.serializer.setErrorHandler(settings.errorHandler); } - if (settings.replacer) this.replacer = settings.replacer; - if (settings.typeResolver) this.deserializer.setTypeResolver(settings.typeResolver); - if (settings.typeHintEmitter) this.serializer.setTypeHintEmitter(settings.typeHintEmitter); - if (settings.indent) this.indent = settings.indent; + if (settings.replacer) { +this.replacer = settings.replacer; +} + if (settings.typeResolver) { +this.deserializer.setTypeResolver(settings.typeResolver); +} + if (settings.typeHintEmitter) { +this.serializer.setTypeHintEmitter(settings.typeHintEmitter); +} + if (settings.indent) { +this.indent = settings.indent; +} - if (settings.nameResolver) - { + if (settings.nameResolver) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); // this.serializer.set } - if (settings.knownTypes) - { + if (settings.knownTypes) { // Type-check knownTypes elements to recognize errors in advance. - settings.knownTypes.forEach((knownType, i) => - { + settings.knownTypes.forEach((knownType, i) => { // tslint:disable-next-line:no-null-keyword - if (typeof knownType === "undefined" || knownType === null) - { + if (typeof knownType === 'undefined' || knownType === null) { logWarning( - `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`); + `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`, +); } }); @@ -323,69 +297,61 @@ export class TypedJSON * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). * @returns Deserialized T or undefined if there were errors. */ - public parse(object: any): T|undefined - { + parse(object: any): T | undefined { const json = parseToJSObject(object, this.rootConstructor); - let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor); - let result: T|undefined; - let knownTypes = new Map(); + const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor); + let result: T | undefined; + const knownTypes = new Map(); - this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => - { + this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => { knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); }); - if (rootMetadata) - { - rootMetadata.knownTypes.forEach(knownTypeCtor => - { + if (rootMetadata) { + rootMetadata.knownTypes.forEach(knownTypeCtor => { knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); }); } - try - { + try { result = this.deserializer.convertSingleValue( json, ensureTypeDescriptor(this.rootConstructor), knownTypes, ) as T; - } - catch (e) - { + } catch (e) { this.errorHandler(e); } return result; } - public parseAsArray(object: any, dimensions?: 1): T[]; - public parseAsArray(object: any, dimensions: 2): T[][]; - public parseAsArray(object: any, dimensions: 3): T[][][]; - public parseAsArray(object: any, dimensions: 4): T[][][][]; - public parseAsArray(object: any, dimensions: 5): T[][][][][]; - public parseAsArray(object: any, dimensions: number): any[]; - public parseAsArray(object: any, dimensions: number = 1): any[] - { + parseAsArray(object: any, dimensions?: 1): Array; + parseAsArray(object: any, dimensions: 2): Array>; + parseAsArray(object: any, dimensions: 3): Array>>; + parseAsArray(object: any, dimensions: 4): Array>>>; + parseAsArray(object: any, dimensions: 5): Array>>>>; + parseAsArray(object: any, dimensions: number): Array; + parseAsArray(object: any, dimensions: number = 1): Array { const json = parseToJSObject(object, Array); - return this.deserializer.convertSingleValue(json, + return this.deserializer.convertSingleValue( +json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes), ); } - public parseAsSet(object: any): Set - { + parseAsSet(object: any): Set { const json = parseToJSObject(object, Set); - return this.deserializer.convertSingleValue(json, + return this.deserializer.convertSingleValue( +json, SetT(this.rootConstructor), - this._mapKnownTypes(this.globalKnownTypes) + this._mapKnownTypes(this.globalKnownTypes), ); } - public parseAsMap(object: any, keyConstructor: Serializable): Map - { + parseAsMap(object: any, keyConstructor: Serializable): Map { const json = parseToJSObject(object, Map); return this.deserializer.convertSingleValue( json, @@ -399,60 +365,42 @@ export class TypedJSON * @param object The instance to convert to a JSON string. * @returns Serialized object or undefined if an error has occured. */ - public toPlainJson(object: T): JsonTypes - { - try - { + toPlainJson(object: T): JsonTypes { + try { return this.serializer.convertSingleValue( object, ensureTypeDescriptor(this.rootConstructor), ); - } - catch (e) - { + } catch (e) { this.errorHandler(e); } } - public toPlainArray(object: T[], dimensions?: 1): Object[]; - public toPlainArray(object: T[][], dimensions: 2): Object[][]; - public toPlainArray(object: T[][][], dimensions: 3): Object[][][]; - public toPlainArray(object: T[][][][], dimensions: 4): Object[][][][]; - public toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][]; - public toPlainArray(object: any[], dimensions: 1|2|3|4|5 = 1): Object[]|undefined - { - try - { - return this.serializer.convertSingleValue( - object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); - } - catch (e) - { + toPlainArray(object: Array, dimensions?: 1): Array; + toPlainArray(object: Array>, dimensions: 2): Array>; + toPlainArray(object: Array>>, dimensions: 3): Array>>; + toPlainArray(object: Array>>>, dimensions: 4): Array>>>; + toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>; + toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined { + try { + return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); + } catch (e) { this.errorHandler(e); } } - public toPlainSet(object: Set): Object[]|undefined - { - try - { + toPlainSet(object: Set): Array | undefined { + try { return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); - } - catch (e) - { + } catch (e) { this.errorHandler(e); } } - public toPlainMap( - object: Map, keyConstructor: Serializable, - ): IndexedObject | { key: any, value: any }[] | undefined { - try - { + toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined { + try { return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); - } - catch (e) - { + } catch (e) { this.errorHandler(e); } } @@ -464,8 +412,7 @@ export class TypedJSON * @returns String with the serialized object or an empty string if an error has occured, but * the errorHandler did not throw. */ - public stringify(object: T): string - { + stringify(object: T): string { const result = this.toPlainJson(object); if (result === undefined) { return ''; @@ -473,29 +420,25 @@ export class TypedJSON return JSON.stringify(result, this.replacer, this.indent); } - public stringifyAsArray(object: T[], dimensions?: 1): string; - public stringifyAsArray(object: T[][], dimensions: 2): string; - public stringifyAsArray(object: T[][][], dimensions: 3): string; - public stringifyAsArray(object: T[][][][], dimensions: 4): string; - public stringifyAsArray(object: T[][][][][], dimensions: 5): string; - public stringifyAsArray(object: any[], dimensions: any): string - { + stringifyAsArray(object: Array, dimensions?: 1): string; + stringifyAsArray(object: Array>, dimensions: 2): string; + stringifyAsArray(object: Array>>, dimensions: 3): string; + stringifyAsArray(object: Array>>>, dimensions: 4): string; + stringifyAsArray(object: Array>>>>, dimensions: 5): string; + stringifyAsArray(object: Array, dimensions: any): string { return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent); } - public stringifyAsSet(object: Set): string - { + stringifyAsSet(object: Set): string { return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent); } - public stringifyAsMap(object: Map, keyConstructor: Serializable): string - { + stringifyAsMap(object: Map, keyConstructor: Serializable): string { return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); } - private _mapKnownTypes(constructors: Array>) - { - let map = new Map>(); + private _mapKnownTypes(constructors: Array>) { + const map = new Map>(); constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor)); diff --git a/src/typedjson.ts b/src/typedjson.ts index 7474d41..d5a808b 100644 --- a/src/typedjson.ts +++ b/src/typedjson.ts @@ -1,9 +1,9 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from "./parser"; -export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from "./typedjson/metadata"; -export { jsonObject } from "./typedjson/json-object"; -export { jsonMember } from "./typedjson/json-member"; -export { jsonArrayMember } from "./typedjson/json-array-member"; -export { jsonSetMember } from "./typedjson/json-set-member"; -export { jsonMapMember } from "./typedjson/json-map-member"; -export { toJson } from "./typedjson/to-json"; -export { ArrayT, SetT, MapT } from "./typedjson/type-descriptor"; +export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser'; +export {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata'; +export {jsonObject} from './typedjson/json-object'; +export {jsonMember} from './typedjson/json-member'; +export {jsonArrayMember} from './typedjson/json-array-member'; +export {jsonSetMember} from './typedjson/json-set-member'; +export {jsonMapMember} from './typedjson/json-map-member'; +export {toJson} from './typedjson/to-json'; +export {ArrayT, SetT, MapT} from './typedjson/type-descriptor'; diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 3037c2b..c54cee1 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -1,7 +1,6 @@ -import { isSubtypeOf, isValueDefined, logError, nameof } from "./helpers"; -import { Constructor, IndexedObject, Serializable } from "./types"; -import { JsonObjectMetadata, TypeResolver } from "./metadata"; -import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; +import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers'; +import {JsonObjectMetadata, TypeResolver} from './metadata'; +import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ConcreteTypeDescriptor, @@ -9,12 +8,13 @@ import { MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, -} from "./type-descriptor"; +} from './type-descriptor'; +import {Constructor, IndexedObject, Serializable} from './types'; -export function defaultTypeResolver( - sourceObject: IndexedObject, knownTypes: Map, -): Function | undefined { - if (sourceObject.__type) return knownTypes.get(sourceObject.__type); +export function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined { + if (sourceObject.__type) { +return knownTypes.get(sourceObject.__type); +} } export type DeserializerFn = ( @@ -30,9 +30,8 @@ export type DeserializerFn = ( * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. * It is used after parsing a JSON-string. */ -export class Deserializer -{ - public options?: OptionsBase; +export class Deserializer { + options?: OptionsBase; private typeResolver: TypeResolver = defaultTypeResolver; private nameResolver?: (ctor: Function) => string; @@ -52,99 +51,80 @@ export class Deserializer [Map, convertAsMap], // typed arrays - [Float32Array, convertAsFloatArray], - [Float64Array, convertAsFloatArray], - [Uint8Array, convertAsUintArray], - [Uint8ClampedArray, convertAsUintArray], - [Uint16Array, convertAsUintArray], + [Float32Array, convertAsFloatArray], + [Float64Array, convertAsFloatArray], + [Uint8Array, convertAsUintArray], + [Uint8ClampedArray, convertAsUintArray], + [Uint16Array, convertAsUintArray], [Uint32Array, convertAsUintArray], ]); - public setNameResolver(nameResolverCallback: (ctor: Function) => string) - { + setNameResolver(nameResolverCallback: (ctor: Function) => string) { this.nameResolver = nameResolverCallback; } - public setTypeResolver(typeResolverCallback: TypeResolver) - { - if (typeof typeResolverCallback !== "function") - { - throw new TypeError("'typeResolverCallback' is not a function."); + setTypeResolver(typeResolverCallback: TypeResolver) { + if (typeof typeResolverCallback !== 'function') { + throw new TypeError('\'typeResolverCallback\' is not a function.'); } this.typeResolver = typeResolverCallback; } - public getTypeResolver(): TypeResolver - { + getTypeResolver(): TypeResolver { return this.typeResolver; } - public setErrorHandler(errorHandlerCallback: (error: Error) => void) - { - if (typeof errorHandlerCallback !== "function") - { - throw new TypeError("'errorHandlerCallback' is not a function."); + setErrorHandler(errorHandlerCallback: (error: Error) => void) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); } this.errorHandler = errorHandlerCallback; } - public getErrorHandler(): (error: Error) => void - { + getErrorHandler(): (error: Error) => void { return this.errorHandler; } - public convertSingleValue( + convertSingleValue( sourceObject: any, typeDescriptor: TypeDescriptor, knownTypes: Map, - memberName = "object", + memberName = 'object', memberOptions?: OptionsBase, ): any { - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) - { + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { return null; - } - else if (!isValueDefined(sourceObject)) - { + } else if (!isValueDefined(sourceObject)) { return; } const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer) - { + if (deserializer) { return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); } - if (typeof sourceObject === "object") - { + if (typeof sourceObject === 'object') { return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); } this.errorHandler(new TypeError( - `Could not deserialize '${memberName}': don't know how to deserialize this type'.`), - ); + `Could not deserialize '${memberName}': don't know how to deserialize this type'.`, +)); } - public instantiateType(ctor: any) - { + instantiateType(ctor: any) { return new ctor(); } - public mergeKnownTypes(...knownTypeMaps: Array>) - { - let result = new Map(); + mergeKnownTypes(...knownTypeMaps: Array>) { + const result = new Map(); - knownTypeMaps.forEach(knownTypes => - { - knownTypes.forEach((ctor, name) => - { - if (this.nameResolver) - { + knownTypeMaps.forEach(knownTypes => { + knownTypes.forEach((ctor, name) => { + if (this.nameResolver) { result.set(this.nameResolver(ctor), ctor); - } - else - { + } else { result.set(name, ctor); } }); @@ -153,18 +133,13 @@ export class Deserializer return result; } - public createKnownTypesMap(knowTypes: Set) - { + createKnownTypesMap(knowTypes: Set) { const map = new Map(); - knowTypes.forEach(ctor => - { - if (this.nameResolver) - { + knowTypes.forEach(ctor => { + if (this.nameResolver) { map.set(this.nameResolver(ctor), ctor); - } - else - { + } else { const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor); const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name ? knownTypeMeta.name @@ -178,11 +153,10 @@ export class Deserializer private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { return (expectedShape === MapShape.ARRAY && Array.isArray(source)) - || (expectedShape === MapShape.OBJECT && typeof source === "object"); + || (expectedShape === MapShape.OBJECT && typeof source === 'object'); } - public retrievePreserveNull(memberOptions?: OptionsBase): boolean - { + retrievePreserveNull(memberOptions?: OptionsBase): boolean { return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); } } @@ -199,10 +173,9 @@ function throwTypeMismatchError( ); } -function makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) -{ - const expectedTypeName = (typeof expectedType === "function") ? nameof(expectedType) : expectedType; - const actualTypeName = (typeof actualType === "function") ? nameof(actualType) : actualType; +function makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) { + const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType; + const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`; } @@ -217,8 +190,7 @@ function deserializeDirectly( knownTypes: Map, objectName: string, ): T { - if (sourceObject.constructor !== typeDescriptor.ctor) - { + if (sourceObject.constructor !== typeDescriptor.ctor) { throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); } return sourceObject; @@ -230,11 +202,10 @@ function convertAsObject( knownTypes: Map, memberName: string, deserializer: Deserializer, -): IndexedObject|T|undefined { - if (typeof sourceObject !== "object" || sourceObject === null) - { +): IndexedObject | T | undefined { + if (typeof sourceObject !== 'object' || sourceObject === null) { deserializer.getErrorHandler()( - new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`) + new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`), ); return undefined; } @@ -244,15 +215,13 @@ function convertAsObject( let knownTypeConstructors = knownTypes; let typeResolver = deserializer.getTypeResolver(); - if (sourceObjectMetadata) - { + if (sourceObjectMetadata) { // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = deserializer.mergeKnownTypes( knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes), ); - if (sourceObjectMetadata.typeResolver) - { + if (sourceObjectMetadata.typeResolver) { typeResolver = sourceObjectMetadata.typeResolver; } } @@ -260,17 +229,14 @@ function convertAsObject( // Check if a type-hint is available from the source object. const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint) - { + if (typeFromTypeHint) { // Check if type hint is a valid subtype of the expected source type. - if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) - { + if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { // Hell yes. expectedSelfType = typeFromTypeHint; sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata) - { + if (sourceObjectMetadata) { // Also merge new known types from subtype. knownTypeConstructors = deserializer.mergeKnownTypes( knownTypeConstructors, @@ -280,8 +246,7 @@ function convertAsObject( } } - if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) - { + if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) { const sourceMetadata = sourceObjectMetadata; // Strong-typed deserialization available, get to it. // First deserialize properties into a temporary object. @@ -290,19 +255,15 @@ function convertAsObject( const classOptions = mergeOptions(deserializer.options, sourceMetadata.options); // Deserialize by expected properties. - sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => - { + sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => { const objMemberValue = sourceObject[propKey]; const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`; const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let revivedValue; - if (objMemberMetadata.deserializer) - { + if (objMemberMetadata.deserializer) { revivedValue = objMemberMetadata.deserializer(objMemberValue); - } - else if (objMemberMetadata.type) - { + } else if (objMemberMetadata.type) { revivedValue = deserializer.convertSingleValue( objMemberValue, objMemberMetadata.type, @@ -310,9 +271,7 @@ function convertAsObject( objMemberDebugName, objMemberOptions, ); - } - else - { + } else { throw new TypeError( `Cannot deserialize ${objMemberDebugName} there is` + ` no constructor nor deserialization function to use.`, @@ -323,9 +282,7 @@ function convertAsObject( || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null) ) { sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue; - } - else if (objMemberMetadata.isRequired) - { + } else if (objMemberMetadata.isRequired) { deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`)); } }); @@ -333,26 +290,21 @@ function convertAsObject( // Next, instantiate target object. let targetObject: IndexedObject; - if (typeof sourceObjectMetadata.initializerCallback === "function") - { - try - { + if (typeof sourceObjectMetadata.initializerCallback === 'function') { + try { targetObject = sourceObjectMetadata.initializerCallback( sourceObjectWithDeserializedProperties, sourceObject, ); // Check the validity of user-defined initializer callback. - if (!targetObject) - { + if (!targetObject) { throw new TypeError( `Cannot deserialize ${memberName}:` + ` 'initializer' function returned undefined/null` + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`, ); - } - else if (!(targetObject instanceof sourceObjectMetadata.classType)) - { + } else if (!(targetObject instanceof sourceObjectMetadata.classType)) { throw new TypeError( `Cannot deserialize ${memberName}:` + `'initializer' returned '${nameof(targetObject.constructor)}'` @@ -361,15 +313,11 @@ function convertAsObject( + ` '${nameof(sourceObjectMetadata.classType)}'`, ); } - } - catch (e) - { + } catch (e) { deserializer.getErrorHandler()(e); return undefined; } - } - else - { + } else { targetObject = deserializer.instantiateType(expectedSelfType); } @@ -377,40 +325,32 @@ function convertAsObject( Object.assign(targetObject, sourceObjectWithDeserializedProperties); // Call onDeserialized method (if any). - if (sourceObjectMetadata.onDeserializedMethodName) - { + if (sourceObjectMetadata.onDeserializedMethodName) { // check for member first - if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") - { + if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') { (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName](); } // check for static - else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === "function") - { + else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') { (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName](); - } - else - { + } else { deserializer.getErrorHandler()(new TypeError( - `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.` + `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`, )); } } return targetObject; - } - else - { + } else { // Untyped deserialization into Object instance. const targetObject = {} as IndexedObject; - Object.keys(sourceObject).forEach(sourceKey => - { + Object.keys(sourceObject).forEach(sourceKey => { targetObject[sourceKey] = deserializer.convertSingleValue( sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, - sourceKey + sourceKey, ); }); @@ -425,22 +365,19 @@ function convertAsArray( memberName: string, deserializer: Deserializer, memberOptions?: OptionsBase, -): any[] { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) - { +): Array { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } - if (!(Array.isArray(sourceObject))) - { + if (!Array.isArray(sourceObject)) { deserializer.getErrorHandler()( new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)), ); return []; } - if (!typeDescriptor.elementType) - { + if (!typeDescriptor.elementType) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`), ); @@ -450,8 +387,7 @@ function convertAsArray( return sourceObject.map(element => { // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty // entries, as an Array is ordered. - try - { + try { return deserializer.convertSingleValue( element, typeDescriptor.elementType, @@ -459,9 +395,7 @@ function convertAsArray( `${memberName}[]`, memberOptions, ); - } - catch (e) - { + } catch (e) { deserializer.getErrorHandler()(e); // Keep filling the array here with undefined to keep original ordering. @@ -479,19 +413,16 @@ function convertAsSet( deserializer: Deserializer, memberOptions?: OptionsBase, ): Set { - if (!(typeDescriptor instanceof SetTypeDescriptor)) - { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } - if (!(Array.isArray(sourceObject))) - { + if (!Array.isArray(sourceObject)) { deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return new Set(); } - if (!typeDescriptor.elementType) - { + if (!typeDescriptor.elementType) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`), ); @@ -501,8 +432,7 @@ function convertAsSet( const resultSet = new Set(); sourceObject.forEach((element, i) => { - try - { + try { resultSet.add(deserializer.convertSingleValue( element, typeDescriptor.elementType, @@ -510,9 +440,7 @@ function convertAsSet( `${memberName}[${i}]`, memberOptions, )); - } - catch (e) - { + } catch (e) { // Faulty entries are skipped, because a Set is not ordered, and skipping an entry // does not affect others. deserializer.getErrorHandler()(e); @@ -524,7 +452,7 @@ function convertAsSet( function isExpectedMapShape(source: any, expectedShape: MapShape): boolean { return (expectedShape === MapShape.ARRAY && Array.isArray(source)) - || (expectedShape === MapShape.OBJECT && typeof source === "object"); + || (expectedShape === MapShape.OBJECT && typeof source === 'object'); } function convertAsMap( @@ -535,14 +463,12 @@ function convertAsMap( deserializer: Deserializer, memberOptions?: OptionsBase, ): Map { - if (!(typeDescriptor instanceof MapTypeDescriptor)) - { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } const expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!isExpectedMapShape(sourceObject, expectedShape)) - { + if (!isExpectedMapShape(sourceObject, expectedShape)) { const expectedType = expectedShape === MapShape.ARRAY ? Array : Object; deserializer.getErrorHandler()( new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)), @@ -550,16 +476,14 @@ function convertAsMap( return new Map(); } - if (!typeDescriptor.keyType) - { + if (!typeDescriptor.keyType) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`), ); return new Map(); } - if (!typeDescriptor.valueType) - { + if (!typeDescriptor.valueType) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`), ); @@ -568,11 +492,9 @@ function convertAsMap( const resultMap = new Map(); - if (expectedShape === MapShape.OBJECT) - { + if (expectedShape === MapShape.OBJECT) { Object.keys(sourceObject).forEach(key => { - try - { + try { const resultKey = deserializer.convertSingleValue( key, typeDescriptor.keyType, @@ -580,8 +502,7 @@ function convertAsMap( memberName, memberOptions, ); - if (isValueDefined(resultKey)) - { + if (isValueDefined(resultKey)) { resultMap.set( resultKey, deserializer.convertSingleValue( @@ -593,20 +514,15 @@ function convertAsMap( ), ); } - } - catch (e) - { + } catch (e) { // Faulty entries are skipped, because a Map is not ordered, // and skipping an entry does not affect others. deserializer.getErrorHandler()(e); } - }) - } - else - { + }); + } else { sourceObject.forEach((element: any) => { - try - { + try { const key = deserializer.convertSingleValue( element.key, typeDescriptor.keyType, @@ -616,8 +532,7 @@ function convertAsMap( ); // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) - { + if (isValueDefined(key)) { resultMap.set( key, deserializer.convertSingleValue( @@ -629,9 +544,7 @@ function convertAsMap( ), ); } - } - catch (e) - { + } catch (e) { // Faulty entries are skipped, because a Map is not ordered, // and skipping an entry does not affect others. deserializer.getErrorHandler()(e); @@ -651,17 +564,12 @@ function deserializeDate( // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === "string" || (typeof sourceObject === "number" && sourceObject > 0)) - { + if (typeof sourceObject === 'string' || (typeof sourceObject === 'number' && sourceObject > 0)) { return new Date(sourceObject as any); - } - else if (sourceObject instanceof Date) - { - return sourceObject - } - else - { - throwTypeMismatchError("Date", "an ISO-8601 string", srcTypeNameForDebug(sourceObject), memberName); + } else if (sourceObject instanceof Date) { + return sourceObject; + } else { + throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); } } @@ -671,9 +579,8 @@ function stringToArrayBuffer( knownTypes: Map, memberName: string, ) { - if (typeof sourceObject !== "string") - { - throwTypeMismatchError("ArrayBuffer", "a string source", srcTypeNameForDebug(sourceObject), memberName); + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); } return createArrayBufferFromString(sourceObject); } @@ -684,19 +591,17 @@ function stringToDataView( knownTypes: Map, memberName: string, ) { - if (typeof sourceObject !== "string") - { - throwTypeMismatchError("DataView", "a string source", srcTypeNameForDebug(sourceObject), memberName); + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); } return new DataView(createArrayBufferFromString(sourceObject)); } function createArrayBufferFromString(input: string): ArrayBuffer { - let buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char - let bufView = new Uint16Array(buf); + const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char + const bufView = new Uint16Array(buf); - for (let i = 0, strLen = input.length; i < strLen; i++) - { + for (let i = 0, strLen = input.length; i < strLen; i++) { bufView[i] = input.charCodeAt(i); } @@ -710,13 +615,12 @@ function convertAsFloatArray( memberName: string, ): T { const constructor = typeDescriptor.ctor as Constructor; - if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) - { + if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) { return new constructor(sourceObject); } return throwTypeMismatchError( constructor.name, - "a numeric source array", + 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName, ); @@ -729,13 +633,12 @@ function convertAsUintArray; - if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) - { + if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) { return new constructor(sourceObject.map(value => ~~value)); } return throwTypeMismatchError( typeDescriptor.ctor.name, - "a numeric source array", + 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName, ); diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 4270a49..9ed54fa 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -1,37 +1,32 @@ -import { Serializable } from './types'; +import {Serializable} from './types'; -declare abstract class Reflect -{ - public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; +declare abstract class Reflect { + static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + - ' and "emitDecoratorMetadata" in your tsconfig.json?'; +export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + + ' and "emitDecoratorMetadata" in your tsconfig.json?'; /** * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. * Values of these types don't need special conversion. * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`). */ -export function isDirectlySerializableNativeType(type: Function): boolean -{ - return !!(~[Date, Number, String, Boolean].indexOf(type as any)); +export function isDirectlySerializableNativeType(type: Function): boolean { + return Boolean(~[Date, Number, String, Boolean].indexOf(type as any)); } -export function isDirectlyDeserializableNativeType(type: Function): boolean -{ - return !!(~[Number, String, Boolean].indexOf(type as any)); +export function isDirectlyDeserializableNativeType(type: Function): boolean { + return Boolean(~[Number, String, Boolean].indexOf(type as any)); } -export function isTypeTypedArray(type: Function): boolean -{ - return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] +export function isTypeTypedArray(type: Function): boolean { + return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] .indexOf(type as any)); } -export function isObject(value: any): value is Object -{ - return typeof value === "object"; +export function isObject(value: any): value is Object { + return typeof value === 'object'; } function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean { @@ -39,15 +34,14 @@ function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean || expectedType === ArrayBuffer || expectedType === DataView; - const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length-1] === '"'; + 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: Serializable): Object { - if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) - { + if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { return json; } return JSON.parse(json); @@ -58,39 +52,28 @@ export function parseToJSObject(json: any, expectedType: Serializable): Ob * @param A The supposed derived type. * @param B The supposed base type. */ -export function isSubtypeOf(A: Function, B: Function) -{ +export function isSubtypeOf(A: Function, B: Function) { return A === B || A.prototype instanceof B; } -export function logError(message?: any, ...optionalParams: any[]) -{ - if (typeof console === "object" && typeof console.error === "function") - { +export function logError(message?: any, ...optionalParams: Array) { + if (typeof console === 'object' && typeof console.error === 'function') { console.error(message, ...optionalParams); - } - else if (typeof console === "object" && typeof console.log === "function") - { + } else if (typeof console === 'object' && typeof console.log === 'function') { console.log(`ERROR: ${message}`, ...optionalParams); } } -export function logMessage(message?: any, ...optionalParams: any[]) -{ - if (typeof console === "object" && typeof console.log === "function") - { +export function logMessage(message?: any, ...optionalParams: Array) { + if (typeof console === 'object' && typeof console.log === 'function') { console.log(message, ...optionalParams); } } -export function logWarning(message?: any, ...optionalParams: any[]) -{ - if (typeof console === "object" && typeof console.warn === "function") - { +export function logWarning(message?: any, ...optionalParams: Array) { + if (typeof console === 'object' && typeof console.warn === 'function') { console.warn(message, ...optionalParams); - } - else if (typeof console === "object" && typeof console.log === "function") - { + } else if (typeof console === 'object' && typeof console.log === 'function') { console.log(`WARNING: ${message}`, ...optionalParams); } } @@ -99,47 +82,36 @@ export function logWarning(message?: any, ...optionalParams: any[]) * Checks if the value is considered defined (not undefined and not null). * @param value */ -export function isValueDefined(value: T): value is Exclude -{ - return !(typeof value === "undefined" || value === null); +export function isValueDefined(value: T): value is Exclude { + return !(typeof value === 'undefined' || value === null); } -export function isInstanceOf(value: any, constructor: Function): boolean -{ - if (typeof value === "number") - { - return (constructor === Number); - } - else if (typeof value === "string") - { - return (constructor === String); - } - else if (typeof value === "boolean") - { - return (constructor === Boolean); - } - else if (isObject(value)) - { - return (value instanceof constructor); +export function isInstanceOf(value: any, constructor: Function): boolean { + if (typeof value === 'number') { + return constructor === Number; + } else if (typeof value === 'string') { + return constructor === String; + } else if (typeof value === 'boolean') { + return constructor === Boolean; + } else if (isObject(value)) { + return value instanceof constructor; } return false; } export const isReflectMetadataSupported = - (typeof Reflect === "object" && typeof Reflect.getMetadata === "function"); + typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; /** * Gets the name of a function. * @param fn The function whose name to get. */ -export function nameof(fn: Function & { name?: string }) -{ - if (typeof fn.name === "string") - { +export function nameof(fn: Function & { name?: string }) { + if (typeof fn.name === 'string') { return fn.name; } - return "undefined"; + return 'undefined'; } export function identity(arg: T): T { diff --git a/src/typedjson/json-array-member.ts b/src/typedjson/json-array-member.ts index 3167013..d3c7281 100644 --- a/src/typedjson/json-array-member.ts +++ b/src/typedjson/json-array-member.ts @@ -1,20 +1,18 @@ -import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from "./helpers"; -import { injectMetadataInformation } from "./metadata"; -import { extractOptionBase, OptionsBase } from "./options-base"; +import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; +import {injectMetadataInformation} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ensureTypeDescriptor, isTypelike, TypeDescriptor, -} from "./type-descriptor"; +} from './type-descriptor'; -declare abstract class Reflect -{ - public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; +declare abstract class Reflect { + static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export interface IJsonArrayMemberOptions extends OptionsBase -{ +export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -39,28 +37,23 @@ export interface IJsonArrayMemberOptions extends OptionsBase * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). * @param options Additional options. */ -export function jsonArrayMember(elementConstructor: Function|TypeDescriptor, options: IJsonArrayMemberOptions = {}) -{ - return (target: Object, propKey: string | symbol) => - { +export function jsonArrayMember(elementConstructor: Function | TypeDescriptor, options: IJsonArrayMemberOptions = {}) { + return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (!isTypelike(elementConstructor)) - { + if (!isTypelike(elementConstructor)) { logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`); return; } const dimensions = options.dimensions === undefined ? 1 : options.dimensions; - if (!isNaN(dimensions) && dimensions < 1) - { + if (!isNaN(dimensions) && dimensions < 1) { logError(`${decoratorName}: 'dimensions' option must be at least 1.`); return; } // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Array) - { + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Array) { logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/typedjson/json-map-member.ts b/src/typedjson/json-map-member.ts index 824a0e8..73bb0f6 100644 --- a/src/typedjson/json-map-member.ts +++ b/src/typedjson/json-map-member.ts @@ -1,15 +1,13 @@ -import { nameof, logError, isReflectMetadataSupported, MISSING_REFLECT_CONF_MSG } from "./helpers"; -import { injectMetadataInformation } from "./metadata"; -import { extractOptionBase, OptionsBase } from "./options-base"; -import { isTypelike, MapOptions, MapT, TypeDescriptor } from "./type-descriptor"; +import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; +import {injectMetadataInformation} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; +import {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor'; -declare abstract class Reflect -{ - public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; +declare abstract class Reflect { + static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export interface IJsonMapMemberOptions extends OptionsBase, Partial -{ +export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -34,29 +32,25 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial * @param options Additional options. */ export function jsonMapMember( - keyConstructor: Function|TypeDescriptor, - valueConstructor: Function|TypeDescriptor, + keyConstructor: Function | TypeDescriptor, + valueConstructor: Function | TypeDescriptor, options: IJsonMapMemberOptions = {}, ) { - return (target: Object, propKey: string | symbol) => - { + return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (!isTypelike(keyConstructor)) - { + if (!isTypelike(keyConstructor)) { logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`); return; } - if (!isTypelike(valueConstructor)) - { + if (!isTypelike(valueConstructor)) { logError(`${decoratorName}: could not resolve constructor of map values at runtime.`); return; } // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Map) - { + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Map) { logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index 0c54af2..fff479d 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -1,29 +1,27 @@ -import { - nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf, MISSING_REFLECT_CONF_MSG, -} from "./helpers"; -import { injectMetadataInformation } from "./metadata"; -import { extractOptionBase, OptionsBase } from "./options-base"; +import { + isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof, +} from './helpers'; +import {injectMetadataInformation} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ensureTypeDescriptor, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, -} from "./type-descriptor"; -import { IndexedObject } from './types'; +} from './type-descriptor'; +import {IndexedObject} from './types'; -declare abstract class Reflect -{ - public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; +declare abstract class Reflect { + static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export interface IJsonMemberOptions extends OptionsBase -{ +export interface IJsonMemberOptions extends OptionsBase { /** * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function|TypeDescriptor; + constructor?: Function | TypeDescriptor; /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -59,27 +57,23 @@ export function jsonMember( optionsOrPrototype?: IJsonMemberOptions | IndexedObject, propKey?: string | symbol, ): PropertyDecorator | void { - if (propKey && (typeof propKey === "string" || typeof propKey === "symbol")) - { + if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) { const prototype = optionsOrPrototype as IndexedObject; // For error messages. const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // jsonMember used directly, no additional information directly available besides target and propKey. // Obtain property constructor through ReflectDecorators. - if (isReflectMetadataSupported) - { - const reflectPropCtor = Reflect.getMetadata("design:type", prototype, propKey) as Function; + if (isReflectMetadataSupported) { + const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function; - if (!reflectPropCtor) - { + if (!reflectPropCtor) { logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`); return; } const typeDescriptor = ensureTypeDescriptor(reflectPropCtor); - if (isSpecialPropertyType(decoratorName, typeDescriptor)) - { + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } @@ -88,61 +82,45 @@ export function jsonMember( key: propKey.toString(), name: propKey.toString(), }); - } - else - { + } else { logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`); return; } - } - else - { + } else { // jsonMember used as a decorator factory. - return (target: Object, _propKey: string | symbol) => - { - let options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {}; - let typeDescriptor: TypeDescriptor|undefined; - let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages. - - if (options.hasOwnProperty("constructor")) - { - if (!isValueDefined(options.constructor)) - { + return (target: Object, _propKey: string | symbol) => { + const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {}; + let typeDescriptor: TypeDescriptor | undefined; + const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages. + + if (options.hasOwnProperty('constructor')) { + if (!isValueDefined(options.constructor)) { logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`); return; } // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata("design:type", target, _propKey))) - { + if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`); } - } - else - { + } else { // Use ReflectDecorators to obtain property constructor. - if (isReflectMetadataSupported) - { - const reflectCtor = Reflect.getMetadata("design:type", target, _propKey) as Function; + if (isReflectMetadataSupported) { + const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function; - if (!reflectCtor) - { + if (!reflectCtor) { logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`); return; } typeDescriptor = ensureTypeDescriptor(reflectCtor); - } - else if (!options.deserializer) - { + } else if (!options.deserializer) { logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`); return; } } - - if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) - { + if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, _propKey, { @@ -159,24 +137,20 @@ export function jsonMember( } } -function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor) -{ - if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) - { +function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to` + ` serialize this property.`); return true; } - if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) - { + if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to` + ` serialize this property.`); return true; } - if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) - { + if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to` + ` serialize this property.`); return true; diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index 4dcd342..aa95707 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -1,15 +1,14 @@ -import { Serializable } from "./types"; -import { JsonObjectMetadata, TypeHintEmitter, TypeResolver } from "./metadata"; -import { extractOptionBase, OptionsBase } from "./options-base"; +import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; +import {Serializable} from './types'; export type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; -export interface IJsonObjectOptionsBase extends OptionsBase -{ +export interface IJsonObjectOptionsBase extends OptionsBase { /** * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Function[]; + knownTypes?: Array; /** * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. @@ -40,8 +39,7 @@ export interface IJsonObjectOptionsBase extends OptionsBase name?: string; } -export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase -{ +export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase { /** * Function to call before deserializing and initializing the object, accepting two arguments: * (1) sourceObject, an 'Object' instance with all properties already deserialized, and @@ -51,8 +49,7 @@ export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptions initializer: InitializerCallback; } -export interface IJsonObjectOptions extends IJsonObjectOptionsBase -{ +export interface IJsonObjectOptions extends IJsonObjectOptionsBase { /** * Function to call before deserializing and initializing the object, accepting two arguments: * (1) sourceObject, an 'Object' instance with all properties already deserialized, and @@ -80,73 +77,61 @@ export function jsonObject(options?: IJsonObjectOptions): (target: Seriali */ export function jsonObject(target: Serializable): void; -export function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable -): ((target: Serializable) => void) | void { +export function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void { let options: IJsonObjectOptions; - if (typeof optionsOrTarget === "function") - { + if (typeof optionsOrTarget === 'function') { // jsonObject is being used as a decorator, directly. options = {}; - } - else - { + } else { // jsonObject is being used as a decorator factory. options = optionsOrTarget || {}; } function decorator( - target: Serializable + target: Serializable, ): void { // Create or obtain JsonObjectMetadata object. - let objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype); + const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype); // Fill JsonObjectMetadata. objectMetadata.isExplicitlyMarked = true; objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver) - { + if (options.typeResolver) { objectMetadata.typeResolver = options.typeResolver; } - if (options.typeHintEmitter) - { + if (options.typeHintEmitter) { objectMetadata.typeHintEmitter = options.typeHintEmitter; } // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer as any; - if (options.name) - { + if (options.name) { objectMetadata.name = options.name; } const optionsBase = extractOptionBase(options); - if (optionsBase) - { + if (optionsBase) { objectMetadata.options = optionsBase; } - if (options.knownTypes) - { + if (options.knownTypes) { options.knownTypes - .filter(knownType => !!knownType) + .filter(knownType => Boolean(knownType)) .forEach(knownType => objectMetadata.knownTypes.add(knownType)); } } - if (typeof optionsOrTarget === "function") - { + if (typeof optionsOrTarget === 'function') { // jsonObject is being used as a decorator, directly. decorator(optionsOrTarget); - } - else - { + } else { // jsonObject is being used as a decorator factory. return decorator; } } function isSubClass(target: Serializable) { - return + return; } diff --git a/src/typedjson/json-set-member.ts b/src/typedjson/json-set-member.ts index 09ac838..7386f19 100644 --- a/src/typedjson/json-set-member.ts +++ b/src/typedjson/json-set-member.ts @@ -1,15 +1,13 @@ -import { isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof } from "./helpers"; -import { injectMetadataInformation } from "./metadata"; -import { extractOptionBase, OptionsBase } from "./options-base"; -import { isTypelike, SetT } from "./type-descriptor"; +import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; +import {injectMetadataInformation} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; +import {isTypelike, SetT} from './type-descriptor'; -declare abstract class Reflect -{ - public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; +declare abstract class Reflect { + static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export interface IJsonSetMemberOptions extends OptionsBase -{ +export interface IJsonSetMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean; @@ -32,21 +30,17 @@ export interface IJsonSetMemberOptions extends OptionsBase * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set). * @param options Additional options. */ -export function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) -{ - return (target: Object, propKey: string | symbol) => - { +export function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) { + return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. - if (!isTypelike(elementConstructor)) - { + if (!isTypelike(elementConstructor)) { logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`); return; } // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata("design:type", target, propKey) !== Set) - { + if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) { logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index e8bff8d..c449623 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -1,11 +1,11 @@ -import { nameof, logError, isDirectlySerializableNativeType, isTypeTypedArray } from "./helpers"; -import { IndexedObject, Serializable } from "./types"; -import { OptionsBase } from "./options-base"; -import { TypeDescriptor } from "./type-descriptor"; +import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers'; +import {OptionsBase} from './options-base'; +import {TypeDescriptor} from './type-descriptor'; +import {IndexedObject, Serializable} from './types'; -export const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; +export const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; -export type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function|undefined|null; +export type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null; export type TypeHintEmitter = ( targetObject: IndexedObject, @@ -14,8 +14,7 @@ export type TypeHintEmitter sourceTypeMetadata?: JsonObjectMetadata, ) => void; -export interface JsonMemberMetadata -{ +export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ emitDefaultValue?: boolean; @@ -40,15 +39,13 @@ export interface JsonMemberMetadata serializer?: (value: any) => any; } -export class JsonObjectMetadata -{ - //#region Static +export class JsonObjectMetadata { + // #region Static /** * Gets the name of a class as it appears in a serialized JSON string. * @param ctor The constructor of a class (with or without jsonObject). */ - public static getJsonObjectName(ctor: Function): string - { + static getJsonObjectName(ctor: Function): string { const metadata = JsonObjectMetadata.getFromConstructor(ctor); return metadata ? nameof(metadata.classType) : nameof(ctor); } @@ -57,30 +54,25 @@ export class JsonObjectMetadata * Gets jsonObject metadata information from a class. * @param ctor The constructor class. */ - public static getFromConstructor(ctor: Serializable): JsonObjectMetadata|undefined - { + static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined { const prototype = ctor.prototype; - if (!prototype) - { + if (!prototype) { return; } - let metadata: JsonObjectMetadata|undefined; - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) - { + let metadata: JsonObjectMetadata | undefined; + if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { // The class prototype contains own jsonObject metadata metadata = prototype[METADATA_FIELD_KEY]; } // Ignore implicitly added jsonObject (through jsonMember) - if (metadata && metadata.isExplicitlyMarked) - { + if (metadata && metadata.isExplicitlyMarked) { return metadata; } // In the end maybe it is something which we can handle directly - if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) - { + if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) { const primitiveMeta = new JsonObjectMetadata(ctor); primitiveMeta.isExplicitlyMarked = true; // we do not store the metadata here to not modify builtin prototype @@ -88,8 +80,7 @@ export class JsonObjectMetadata } } - public static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata - { + static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata { if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { return prototype[METADATA_FIELD_KEY]; } @@ -98,11 +89,9 @@ export class JsonObjectMetadata // Inherit json members and known types from parent @jsonObject (if any). const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY]; - if (parentMetadata) - { + if (parentMetadata) { parentMetadata.dataMembers - .forEach((memberMetadata, propKey) => - objectMetadata.dataMembers.set(propKey, memberMetadata)); + .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata)); parentMetadata.knownTypes .forEach((knownType) => objectMetadata.knownTypes.add(knownType)); objectMetadata.typeResolver = parentMetadata.typeResolver; @@ -113,7 +102,7 @@ export class JsonObjectMetadata enumerable: false, configurable: false, writable: false, - value: objectMetadata + value: objectMetadata, }); return objectMetadata; } @@ -122,18 +111,16 @@ export class JsonObjectMetadata * Gets the known type name of a jsonObject class for type hint. * @param constructor The constructor class. */ - public static getKnownTypeNameFromType(constructor: Function): string - { + static getKnownTypeNameFromType(constructor: Function): string { const metadata = JsonObjectMetadata.getFromConstructor(constructor); return metadata ? nameof(metadata.classType) : nameof(constructor); } - private static doesHandleWithoutAnnotation(ctor: Function): boolean - { + private static doesHandleWithoutAnnotation(ctor: Function): boolean { return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) || ctor === DataView || ctor === ArrayBuffer; } - //#endregion + // #endregion constructor( classType: Function, @@ -141,65 +128,61 @@ export class JsonObjectMetadata this.classType = classType; } - public dataMembers = new Map(); + dataMembers = new Map(); /** Set of known types used for polymorphic deserialization */ - public knownTypes = new Set>(); + knownTypes = new Set>(); /** If present override the global function */ - public typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter; /** If present override the global function */ - public typeResolver?: TypeResolver; + typeResolver?: TypeResolver; /** Gets or sets the constructor function for the jsonObject. */ - public classType: Function; + classType: Function; /** * Indicates whether this class was explicitly annotated with @jsonObject * or implicitly by @jsonMember */ - public isExplicitlyMarked: boolean = false; + isExplicitlyMarked: boolean = false; /** * Indicates whether this type is handled without annotation. This is usually * used for the builtin types (except for Maps, Sets, and normal Arrays). */ - public isHandledWithoutAnnotation: boolean = false; + isHandledWithoutAnnotation: boolean = false; /** Name used to encode polymorphic type */ - public name?: string; + name?: string; - public options?: OptionsBase; + options?: OptionsBase; - public onDeserializedMethodName?: string; + onDeserializedMethodName?: string; - public beforeSerializationMethodName?: string; + beforeSerializationMethodName?: string; - public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; + initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; } -export function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) -{ +export function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) { const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages. // When a property decorator is applied to a static member, 'constructor' is a constructor function. // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. - if (typeof prototype === "function") - { + if (typeof prototype === 'function') { logError(`${decoratorName}: cannot use a static property.`); return; } // Methods cannot be serialized. // @ts-ignore symbol indexing is not supported by ts - if (typeof prototype[propKey] === "function") - { + if (typeof prototype[propKey] === 'function') { logError(`${decoratorName}: cannot use a method property.`); return; } - if (!metadata || (!metadata.type && !metadata.deserializer)) - { + if (!metadata || (!metadata.type && !metadata.deserializer)) { logError(`${decoratorName}: JsonMemberMetadata has unknown type.`); return; } @@ -208,8 +191,7 @@ export function injectMetadataInformation(prototype: IndexedObject, propKey: str // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well. const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype); - if (!metadata.deserializer) - { + if (!metadata.deserializer) { // @ts-ignore above is a check (!deser && !ctor) metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor)); } diff --git a/src/typedjson/options-base.ts b/src/typedjson/options-base.ts index b0b5b26..cb54665 100644 --- a/src/typedjson/options-base.ts +++ b/src/typedjson/options-base.ts @@ -12,13 +12,13 @@ export interface OptionsBase { preserveNull?: boolean; } -const kAllOptions: (keyof OptionsBase)[] = [ +const kAllOptions: Array = [ 'preserveNull', ]; -export function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase|undefined { +export function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined { const options = Object.keys(from) - .filter(key => (kAllOptions as string[]).indexOf(key) > -1) + .filter(key => (kAllOptions as Array).indexOf(key) > -1) .reduce((obj, key) => { obj[key] = from[key]; return obj; @@ -28,7 +28,7 @@ export function extractOptionBase(from: {[key: string]: any} & OptionsBase): Opt export function getDefaultOptionOf(key: K): Required[K] { switch (key) { - case "preserveNull": + case 'preserveNull': return false; } // never reached @@ -39,19 +39,21 @@ export function getOptionValue( key: K, options?: OptionsBase, ): Required[K] { - if (options && options[key] != null) return options[key]!; + if (options && options[key] != null) { +return options[key]!; +} return getDefaultOptionOf(key); } export function mergeOptions( existing?: OptionsBase, moreSpecific?: OptionsBase, -): OptionsBase|undefined { +): OptionsBase | undefined { return !moreSpecific ? existing - : Object.assign( - {}, - existing, - moreSpecific, - ); + : { + + ...existing, + ...moreSpecific, + }; } diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index c107c8b..6cba4b9 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -1,13 +1,12 @@ -import { +import { identity, isInstanceOf, isValueDefined, logError, nameof, -} from "./helpers"; -import { IndexedObject, Serializable } from "./types"; -import { JsonObjectMetadata, TypeHintEmitter } from "./metadata"; -import { getOptionValue, mergeOptions, OptionsBase } from "./options-base"; +} from './helpers'; +import {JsonObjectMetadata, TypeHintEmitter} from './metadata'; +import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ConcreteTypeDescriptor, @@ -15,7 +14,8 @@ import { MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, -} from "./type-descriptor"; +} from './type-descriptor'; +import {IndexedObject, Serializable} from './types'; export function defaultTypeEmitter( targetObject: IndexedObject, @@ -26,8 +26,7 @@ export function defaultTypeEmitter( // 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 will know what to deserialize into (given // the required known-types are defined, and the object is a valid subtype of the expected type). - if (sourceObject.constructor !== expectedSourceType) - { + if (sourceObject.constructor !== expectedSourceType) { targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name ? sourceTypeMetadata.name : nameof(sourceObject.constructor); @@ -59,9 +58,8 @@ export type SerializerFn = ( * * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string */ -export class Serializer -{ - public options?: OptionsBase; +export class Serializer { + options?: OptionsBase; private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter; private errorHandler: (error: Error) => void = logError; private serializationStrategy = new Map, SerializerFn>([ @@ -79,49 +77,42 @@ export class Serializer [Map, convertAsMap], // typed arrays - [Float32Array, convertAsTypedArray], - [Float64Array, convertAsTypedArray], - [Int8Array, convertAsTypedArray], - [Uint8Array, convertAsTypedArray], - [Uint8ClampedArray, convertAsTypedArray], - [Int16Array, convertAsTypedArray], - [Uint16Array, convertAsTypedArray], - [Int32Array, convertAsTypedArray], + [Float32Array, convertAsTypedArray], + [Float64Array, convertAsTypedArray], + [Int8Array, convertAsTypedArray], + [Uint8Array, convertAsTypedArray], + [Uint8ClampedArray, convertAsTypedArray], + [Int16Array, convertAsTypedArray], + [Uint16Array, convertAsTypedArray], + [Int32Array, convertAsTypedArray], [Uint32Array, convertAsTypedArray], ]); - public setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) - { - if (typeof typeEmitterCallback !== "function") - { - throw new TypeError("'typeEmitterCallback' is not a function."); + setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) { + if (typeof typeEmitterCallback !== 'function') { + throw new TypeError('\'typeEmitterCallback\' is not a function.'); } this.typeHintEmitter = typeEmitterCallback; } - public getTypeHintEmitter(): TypeHintEmitter - { + getTypeHintEmitter(): TypeHintEmitter { return this.typeHintEmitter; } - public setErrorHandler(errorHandlerCallback: (error: Error) => void) - { - if (typeof errorHandlerCallback !== "function") - { - throw new TypeError("'errorHandlerCallback' is not a function."); + setErrorHandler(errorHandlerCallback: (error: Error) => void) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); } this.errorHandler = errorHandlerCallback; } - public getErrorHandler(): (error: Error) => void - { + getErrorHandler(): (error: Error) => void { return this.errorHandler; } - public retrievePreserveNull(memberOptions?: OptionsBase): boolean - { + retrievePreserveNull(memberOptions?: OptionsBase): boolean { return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); } @@ -129,23 +120,26 @@ export class Serializer * Convert a value of any supported serializable type. * The value type will be detected, and the correct serialization method will be called. */ - public convertSingleValue( + convertSingleValue( sourceObject: any, typeDescriptor: TypeDescriptor, - memberName: string = "object", + memberName: string = 'object', memberOptions?: OptionsBase, ): any { - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) return null; - if (!isValueDefined(sourceObject)) return; + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { +return null; +} + if (!isValueDefined(sourceObject)) { +return; +} - if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) - { - let expectedName = nameof(typeDescriptor.ctor); - let actualName = nameof(sourceObject.constructor); + if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { + const expectedName = nameof(typeDescriptor.ctor); + const actualName = nameof(sourceObject.constructor); this.errorHandler(new TypeError( - `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`), - ); + `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`, +)); return; } @@ -154,13 +148,12 @@ export class Serializer return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); } // if not present in the strategy do property by property serialization - if (typeof sourceObject === "object") - { + if (typeof sourceObject === 'object') { return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); } this.errorHandler(new TypeError( - `Could not serialize '${memberName}': don't know how to serialize this type'.`), - ); + `Could not serialize '${memberName}': don't know how to serialize this type'.`, +)); } } @@ -175,39 +168,30 @@ function convertAsObject( serializer: Serializer, memberOptions?: OptionsBase, ) { - let sourceTypeMetadata: JsonObjectMetadata|undefined; + let sourceTypeMetadata: JsonObjectMetadata | undefined; let targetObject: IndexedObject; let typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) - { + if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { // The source object is not of the expected type, but it is a valid subtype. // This is OK, and we'll proceed to gather object metadata from the subtype instead. sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else - { + } else { sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } - if (sourceTypeMetadata) - { - + if (sourceTypeMetadata) { if (sourceTypeMetadata.beforeSerializationMethodName) { // check for member first - if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") - { + if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName](); } // check for static - else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === "function") - { + else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName](); - } - else - { + } else { serializer.getErrorHandler()(new TypeError( - `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.` + `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`, )); } } @@ -220,13 +204,11 @@ function convertAsObject( targetObject = {}; const classOptions = mergeOptions(serializer.options, sourceMeta.options); - if (sourceMeta.typeHintEmitter) - { + if (sourceMeta.typeHintEmitter) { typeHintEmitter = sourceMeta.typeHintEmitter; } - sourceMeta.dataMembers.forEach((objMemberMetadata) => - { + sourceMeta.dataMembers.forEach((objMemberMetadata) => { const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let serialized; if (objMemberMetadata.serializer) { @@ -251,13 +233,11 @@ function convertAsObject( targetObject[objMemberMetadata.name] = serialized; } }); - } - else - { + } else { // Untyped serialization, "as-is", we'll just pass the object on. // 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. - targetObject = { ...sourceObject }; + targetObject = {...sourceObject}; } // Add type-hint. @@ -271,19 +251,17 @@ function convertAsObject( * (or primitive values) for serialization. */ function convertAsArray( - sourceObject: any[], + sourceObject: Array, typeDescriptor: TypeDescriptor, - memberName:string , + memberName: string, serializer: Serializer, memberOptions?: OptionsBase, -): any[] { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) - { +): Array { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } - if (!typeDescriptor.elementType) - { + if (!typeDescriptor.elementType) { throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); } @@ -292,28 +270,24 @@ function convertAsArray( // value emitted during serialization. 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 // the emitted array. - sourceObject.forEach((element, i) => - { + sourceObject.forEach((element, i) => { if (!(serializer.retrievePreserveNull(memberOptions) && element === null) && !isInstanceOf(element, typeDescriptor.elementType.ctor) ) { const expectedTypeName = nameof(typeDescriptor.elementType.ctor); const actualTypeName = element && nameof(element.constructor); - throw new TypeError(`Could not serialize ${memberName}[${i}]:` + - ` expected '${expectedTypeName}', got '${actualTypeName}'.`); + throw new TypeError(`Could not serialize ${memberName}[${i}]:` + + ` expected '${expectedTypeName}', got '${actualTypeName}'.`); } }); - if (memberName) - { + if (memberName) { // Just for debugging purposes. - memberName += "[]"; + memberName += '[]'; } return sourceObject.map( - element => serializer.convertSingleValue( - element, typeDescriptor.elementType, memberName, memberOptions - ), + element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions), ); } @@ -328,37 +302,32 @@ function convertAsSet( memberName: string, serializer: Serializer, memberOptions?: OptionsBase, -): any[] { - if (!(typeDescriptor instanceof SetTypeDescriptor)) - { +): Array { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } - if (!typeDescriptor.elementType) - { + if (!typeDescriptor.elementType) { throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`); } // For debugging and error tracking. - if (memberName) - { - memberName += "[]"; + if (memberName) { + memberName += '[]'; } - let resultArray: any[] = []; + const resultArray: Array = []; // Convert each element of the set, and put it into an output array. // The output array is the one serialized, as JSON.stringify does not support Set serialization. // (TODO: clarification needed) - sourceObject.forEach(element => - { + sourceObject.forEach(element => { const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); // Add to output if the source element was undefined, OR the converted element is defined. // This will add intentionally undefined values to output, but not values that became undefined // DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) - { + if (!isValueDefined(element) || isValueDefined(resultElement)) { resultArray.push(resultElement); } }); @@ -376,25 +345,21 @@ function convertAsMap( memberName: string, serializer: Serializer, memberOptions?: OptionsBase, -): IndexedObject | { key: any, value: any }[] { - if (!(typeDescriptor instanceof MapTypeDescriptor)) - { +): IndexedObject | Array<{ key: any; value: any }> { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` + ' proper annotation or function for this type'); } - if (!typeDescriptor.valueType) - { + if (!typeDescriptor.valueType) { throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); } - if (!typeDescriptor.keyType) - { + if (!typeDescriptor.keyType) { throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`); } - if (memberName) - { - memberName += "[]"; + if (memberName) { + memberName += '[]'; } // const resultArray: Array<{ key: any, value: any }> = []; @@ -403,9 +368,8 @@ function convertAsMap( const preserveNull = serializer.retrievePreserveNull(memberOptions); // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach((value, key) => - { - let resultKeyValuePairObj = { + sourceObject.forEach((value, key) => { + const resultKeyValuePairObj = { key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), }; @@ -414,8 +378,7 @@ function convertAsMap( const keyDefined = isValueDefined(resultKeyValuePairObj.key); const valueDefined = isValueDefined(resultKeyValuePairObj.value) || (resultKeyValuePairObj.value === null && preserveNull); - if (keyDefined && valueDefined) - { + if (keyDefined && valueDefined) { if (resultShape === MapShape.OBJECT) { result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; } else { @@ -432,25 +395,22 @@ function convertAsMap( * This is needed because typed arrays are otherwise serialized as objects, so we'll end up * with something like "{ 0: 0, 1: 1, ... }". */ -function convertAsTypedArray(sourceObject: ArrayBufferView) -{ +function convertAsTypedArray(sourceObject: ArrayBufferView) { return Array.from(sourceObject as any); } /** * Performs the conversion of a raw ArrayBuffer to a string. */ -function convertAsArrayBuffer(buffer: ArrayBuffer) -{ +function convertAsArrayBuffer(buffer: ArrayBuffer) { // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(""); + return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(''); } /** * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and * returning that string. */ -function convertAsDataView(dataView: DataView) -{ +function convertAsDataView(dataView: DataView) { return convertAsArrayBuffer(dataView.buffer); } diff --git a/src/typedjson/to-json.ts b/src/typedjson/to-json.ts index 905c2bc..12e42cf 100644 --- a/src/typedjson/to-json.ts +++ b/src/typedjson/to-json.ts @@ -1,4 +1,4 @@ -import { TypedJSON } from "../parser"; +import {TypedJSON} from '../parser'; /** * Options for the @toJson decorator. @@ -23,8 +23,7 @@ export function toJson(target: Function): void; * @param options for configuring the toJSON creation. */ export function toJson(options: IToJsonOptions): ((target: Function) => void); -export function toJson(optionsOrTarget: IToJsonOptions | Function -): ((target: Function) => void) | void { +export function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void { if (typeof optionsOrTarget === 'function') { // used directly toJsonDecorator(optionsOrTarget, {}); @@ -33,7 +32,7 @@ export function toJson(optionsOrTarget: IToJsonOptions | Funct // used as a factory return (target: Function) => { toJsonDecorator(target, optionsOrTarget); - } + }; } function toJsonDecorator(target: Function, options: IToJsonOptions): void { @@ -42,5 +41,5 @@ function toJsonDecorator(target: Function, options: IToJsonOpt } target.prototype.toJSON = function () { return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor); - } + }; } diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts index f46c05a..69f9297 100644 --- a/src/typedjson/type-descriptor.ts +++ b/src/typedjson/type-descriptor.ts @@ -1,12 +1,12 @@ export abstract class TypeDescriptor { - protected constructor(public readonly ctor: Function) {} + protected constructor(readonly ctor: Function) {} - getTypes(): Function[] { + getTypes(): Array { return [this.ctor]; } } -export type Typelike = TypeDescriptor|Function; +export type Typelike = TypeDescriptor | Function; export class ConcreteTypeDescriptor extends TypeDescriptor { constructor(ctor: Function) { @@ -21,11 +21,11 @@ export abstract class GenericTypeDescriptor extends TypeDescriptor { } export class ArrayTypeDescriptor extends GenericTypeDescriptor { - constructor(public readonly elementType: TypeDescriptor) { + constructor(readonly elementType: TypeDescriptor) { super(Array); } - getTypes(): Function[] { + getTypes(): Array { return super.getTypes().concat(this.elementType.getTypes()); } } @@ -35,11 +35,11 @@ export function ArrayT(elementType: Typelike): ArrayTypeDescriptor { } export class SetTypeDescriptor extends GenericTypeDescriptor { - constructor(public readonly elementType: TypeDescriptor) { + constructor(readonly elementType: TypeDescriptor) { super(Set); } - getTypes(): Function[] { + getTypes(): Array { return super.getTypes().concat(this.elementType.getTypes()); } } @@ -69,14 +69,14 @@ export interface MapOptions { export class MapTypeDescriptor extends GenericTypeDescriptor { constructor( - public readonly keyType: TypeDescriptor, - public readonly valueType: TypeDescriptor, - public readonly options?: Partial, + readonly keyType: TypeDescriptor, + readonly valueType: TypeDescriptor, + readonly options?: Partial, ) { super(Map); } - getTypes(): Function[] { + getTypes(): Array { return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes()); } @@ -107,7 +107,7 @@ export function MapT(keyType: Typelike, valueType: Typelike, options?: Partial extends Function -{ +export interface AbstractType extends Function { prototype: T; } -export type Constructor = new (...args: any[]) => T; +export type Constructor = new (...args: Array) => T; export type Serializable = Constructor | AbstractType; From 10243a697605d0ec6b151c86eb22255fd6f59d7b Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 26 Aug 2020 20:55:37 +0000 Subject: [PATCH 015/119] Reformat for max-len: 100 --- js/typedjson.d.ts | 2 +- js/typedjson.js | 257 +++++++++++------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 2 +- js/typedjson.min.js.map | 2 +- js/typedjson/helpers.d.ts | 6 +- js/typedjson/json-array-member.d.ts | 8 +- js/typedjson/json-map-member.d.ts | 5 +- js/typedjson/json-member.d.ts | 12 +- js/typedjson/json-object.d.ts | 7 +- js/typedjson/json-set-member.d.ts | 8 +- js/typedjson/serializer.d.ts | 3 +- spec/array.spec.ts | 6 +- spec/base.spec.ts | 12 +- spec/custom-deserializer.spec.ts | 11 +- spec/helpers/matchers.ts | 39 ++- spec/just-json.spec.ts | 12 +- spec/map.spec.ts | 5 +- spec/parse-to-object.spec.ts | 3 +- spec/polymorphism-custom-names.spec.ts | 7 +- spec/polymorphism-custom-type-hints.spec.ts | 62 ++++- spec/polymorphism-root-abstract-class.spec.ts | 5 +- spec/polymorphism.spec.ts | 7 +- spec/preserveNull.spec.ts | 11 +- spec/set.spec.ts | 70 +++-- spec/utils/object-compare.ts | 9 +- src/parser.ts | 145 ++++++++-- src/typedjson.ts | 8 +- src/typedjson/deserializer.ts | 135 ++++++--- src/typedjson/helpers.ts | 26 +- src/typedjson/json-array-member.ts | 31 ++- src/typedjson/json-map-member.ts | 14 +- src/typedjson/json-member.ts | 105 ++++--- src/typedjson/json-object.ts | 15 +- src/typedjson/json-set-member.ts | 17 +- src/typedjson/metadata.ts | 36 ++- src/typedjson/options-base.ts | 4 +- src/typedjson/serializer.ts | 127 ++++++--- src/typedjson/to-json.ts | 4 +- src/typedjson/type-descriptor.ts | 12 +- 40 files changed, 895 insertions(+), 357 deletions(-) diff --git a/js/typedjson.d.ts b/js/typedjson.d.ts index 77e9ff2..41d25e3 100644 --- a/js/typedjson.d.ts +++ b/js/typedjson.d.ts @@ -1,4 +1,4 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter } from './parser'; +export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter, } from './parser'; export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from './typedjson/metadata'; export { jsonObject } from './typedjson/json-object'; export { jsonMember } from './typedjson/json-member'; diff --git a/js/typedjson.js b/js/typedjson.js index a7753af..086f6a3 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -113,9 +113,11 @@ var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + ' and "emitDecoratorMetadata" in your tsconfig.json?'; /** - * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. + * Determines whether the specified type is a type that can be passed on "as-is" into + * `JSON.stringify`. * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`). + * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` + * for `number`). */ function isDirectlySerializableNativeType(type) { return Boolean(~[Date, Number, String, Boolean].indexOf(type)); @@ -124,8 +126,17 @@ function isDirectlyDeserializableNativeType(type) { return Boolean(~[Number, String, Boolean].indexOf(type)); } function isTypeTypedArray(type) { - return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] - .indexOf(type)); + return Boolean(~[ + Float32Array, + Float64Array, + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + ].indexOf(type)); } function isObject(value) { return typeof value === 'object'; @@ -134,9 +145,12 @@ function shouldOmitParseString(jsonStr, expectedType) { var expectsTypesSerializedAsStrings = expectedType === String || expectedType === ArrayBuffer || expectedType === DataView; - var hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length - 1] === '"'; + var hasQuotes = jsonStr.length >= 2 + && jsonStr[0] === '"' + && jsonStr[jsonStr.length - 1] === '"'; var isInteger = /^\d+$/.test(jsonStr.trim()); - return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date); + return (expectsTypesSerializedAsStrings && !hasQuotes) + || ((!hasQuotes && !isInteger) && expectedType === Date); } function parseToJSObject(json, expectedType) { if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { @@ -287,10 +301,12 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { // Inherit json members and known types from parent @jsonObject (if any). var parentMetadata = prototype[METADATA_FIELD_KEY]; if (parentMetadata) { - parentMetadata.dataMembers - .forEach(function (memberMetadata, propKey) { return objectMetadata.dataMembers.set(propKey, memberMetadata); }); - parentMetadata.knownTypes - .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); + parentMetadata.dataMembers.forEach(function (memberMetadata, propKey) { + objectMetadata.dataMembers.set(propKey, memberMetadata); + }); + parentMetadata.knownTypes.forEach(function (knownType) { + objectMetadata.knownTypes.add(knownType); + }); objectMetadata.typeResolver = parentMetadata.typeResolver; objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; } @@ -318,9 +334,13 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { }()); function injectMetadataInformation(prototype, propKey, metadata) { - var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); // For error messages. - // When a property decorator is applied to a static member, 'constructor' is a constructor function. - // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators + // For error messages + var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); + // When a property decorator is applied to a static member, 'constructor' is a constructor + // function. + // See: + // eslint-disable-next-line max-len + // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. if (typeof prototype === 'function') { logError(decoratorName + ": cannot use a static property."); @@ -337,7 +357,8 @@ function injectMetadataInformation(prototype, propKey, metadata) { return; } // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). - // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well. + // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked + // with '@jsonObject' as well. var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); if (!metadata.deserializer) { // @ts-ignore above is a check (!deser && !ctor) @@ -640,9 +661,12 @@ function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); } function makeTypeErrorMessage(expectedType, actualType, memberName) { - var expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType; + var expectedTypeName = typeof expectedType === 'function' + ? nameof(expectedType) + : expectedType; var actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; - return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "', got '" + actualTypeName + "'."; + return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "'," + + (" got '" + actualTypeName + "'."); } function srcTypeNameForDebug(sourceObject) { return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; @@ -743,17 +767,19 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d // Finally, assign deserialized properties to target object. Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); // Call onDeserialized method (if any). - if (sourceObjectMetadata.onDeserializedMethodName) { - // check for member first - if (typeof targetObject[sourceObjectMetadata.onDeserializedMethodName] === 'function') { - targetObject[sourceObjectMetadata.onDeserializedMethodName](); + var methodName = sourceObjectMetadata.onDeserializedMethodName; + if (methodName) { + if (typeof targetObject[methodName] === 'function') { + // check for member first + targetObject[methodName](); } - // check for static - else if (typeof targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName] === 'function') { - targetObject.constructor[sourceObjectMetadata.onDeserializedMethodName](); + else if (typeof targetObject.constructor[methodName] === 'function') { + // check for static + targetObject.constructor[methodName](); } else { - deserializer.getErrorHandler()(new TypeError("onDeserialized callback '" + nameof(sourceObjectMetadata.classType) + "." + sourceObjectMetadata.onDeserializedMethodName + "' is not a method.")); + deserializer.getErrorHandler()(new TypeError("onDeserialized callback" + + ("'" + nameof(sourceObjectMetadata.classType) + "." + methodName + "' is not a method."))); } } return targetObject; @@ -769,19 +795,21 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d } function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected," + + ' please use proper annotation or function for this type'); } if (!Array.isArray(sourceObject)) { deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return []; } if (!typeDescriptor.elementType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of Array elements.")); + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of" + + " Array elements.")); return []; } return sourceObject.map(function (element) { - // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty + // If an array element fails to deserialize, substitute with undefined. This is so that the + // original ordering is not interrupted by faulty // entries, as an Array is ordered. try { return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); @@ -796,15 +824,16 @@ function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, de } function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected," + + " please use proper annotation or function for this type"); } if (!Array.isArray(sourceObject)) { deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return new Set(); } if (!typeDescriptor.elementType) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of Set elements.")); + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of" + + " Set elements.")); return new Set(); } var resultSet = new Set(); @@ -826,8 +855,8 @@ function isExpectedMapShape(source, expectedShape) { } function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected," + + 'please use proper annotation or function for this type'); } var expectedShape = typeDescriptor.getCompleteOptions().shape; if (!isExpectedMapShape(sourceObject, expectedShape)) { @@ -878,9 +907,11 @@ function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, dese return resultMap; } function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since + // the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === 'string' || (typeof sourceObject === 'number' && sourceObject > 0)) { + if (typeof sourceObject === 'string' + || (typeof sourceObject === 'number' && sourceObject > 0)) { return new Date(sourceObject); } else if (sourceObject instanceof Date) { @@ -932,13 +963,14 @@ function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName /** * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * for 'Date[]'). * @param options Additional options. */ function jsonArrayMember(elementConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { - var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. + var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(elementConstructor)) { logError(decoratorName + ": could not resolve constructor of array elements at runtime."); return; @@ -948,8 +980,10 @@ function jsonArrayMember(elementConstructor, options) { logError(decoratorName + ": 'dimensions' option must be at least 1."); return; } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Array) { + // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been + // used on an array. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Array) { logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); return; } @@ -992,7 +1026,8 @@ var serializer_assign = (undefined && undefined.__assign) || function () { function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { // 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 will know what to deserialize into (given - // the required known-types are defined, and the object is a valid subtype of the expected type). + // the required known-types are defined, and the object is a valid subtype of the expected + // type). if (sourceObject.constructor !== expectedSourceType) { targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name ? sourceTypeMetadata.name @@ -1072,7 +1107,8 @@ var serializer_Serializer = /** @class */ (function () { if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { var expectedName = nameof(typeDescriptor.ctor); var actualName = nameof(sourceObject.constructor); - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "', got '" + actualName + "'.")); + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "'," + + (" got '" + actualName + "'."))); return; } var serializer = this.serializationStrategy.get(typeDescriptor.ctor); @@ -1096,7 +1132,8 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se var sourceTypeMetadata; var targetObject; var typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { + if (sourceObject.constructor !== typeDescriptor.ctor + && sourceObject instanceof typeDescriptor.ctor) { // The source object is not of the expected type, but it is a valid subtype. // This is OK, and we'll proceed to gather object metadata from the subtype instead. sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); @@ -1105,24 +1142,29 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } if (sourceTypeMetadata) { - if (sourceTypeMetadata.beforeSerializationMethodName) { - // check for member first - if (typeof sourceObject[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { - sourceObject[sourceTypeMetadata.beforeSerializationMethodName](); + var beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; + if (beforeSerializationMethodName) { + if (typeof sourceObject[beforeSerializationMethodName] === 'function') { + // check for member first + sourceObject[beforeSerializationMethodName](); } - // check for static - else if (typeof sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { - sourceObject.constructor[sourceTypeMetadata.beforeSerializationMethodName](); + else if (typeof sourceObject.constructor[beforeSerializationMethodName] + === 'function') { + // check for static + sourceObject.constructor[beforeSerializationMethodName](); } else { - serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + nameof(sourceTypeMetadata.classType) + "." + sourceTypeMetadata.beforeSerializationMethodName + "' is not a method.")); + serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + + (nameof(sourceTypeMetadata.classType) + "." + beforeSerializationMethodName) + + "' is not a method.")); } } var sourceMeta_1 = sourceTypeMetadata; // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), - // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', - // which is what will be put into 'JSON.stringify' finally. + // We'll serialize by members that have been marked with @jsonMember (including + // array/set/map members), and perform recursive conversion on each of them. The converted + // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' + // finally. targetObject = {}; var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); if (sourceMeta_1.typeHintEmitter) { @@ -1149,7 +1191,8 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se } else { // Untyped serialization, "as-is", we'll just pass the object on. - // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify + // 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. targetObject = serializer_assign({}, sourceObject); } @@ -1158,13 +1201,14 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se return targetObject; } /** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple + * javascript objects * (or primitive values) for serialization. */ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); } if (!typeDescriptor.elementType) { throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); @@ -1187,7 +1231,9 @@ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, ser // Just for debugging purposes. memberName += '[]'; } - return sourceObject.map(function (element) { return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); }); + return sourceObject.map(function (element) { + return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + }); } /** * Performs the conversion of a set of typed objects (or primitive values) into an array @@ -1196,8 +1242,8 @@ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, ser */ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); } if (!typeDescriptor.elementType) { throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); @@ -1213,7 +1259,8 @@ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, seria sourceObject.forEach(function (element) { var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became undefined + // This will add intentionally undefined values to output, but not values that became + // undefined // DURING serializing (usually because of a type-error). if (!isValueDefined(element) || isValueDefined(resultElement)) { resultArray.push(resultElement); @@ -1227,8 +1274,8 @@ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, seria */ function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please use" - + ' proper annotation or function for this type'); + throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); } if (!typeDescriptor.valueType) { throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); @@ -1277,7 +1324,8 @@ function convertAsTypedArray(sourceObject) { */ function convertAsArrayBuffer(buffer) { // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(function (charCode) { return String.fromCharCode(charCode); }).join(''); + return Array.from(new Uint16Array(buffer)) + .map(function (charCode) { return String.fromCharCode(charCode); }).join(''); } /** * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and @@ -1321,7 +1369,8 @@ var parser_TypedJSON = /** @class */ (function () { this.globalKnownTypes = []; this.indent = 0; var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); - if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { + if (!rootMetadata + || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); } this.nameResolver = function (ctor) { return nameof(ctor); }; @@ -1421,7 +1470,8 @@ var parser_TypedJSON = /** @class */ (function () { settings.knownTypes.forEach(function (knownType, i) { // tslint:disable-next-line:no-null-keyword if (typeof knownType === 'undefined' || knownType === null) { - logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value (element " + i + ")."); + logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value" + + (" (element " + i + ").")); } }); this.globalKnownTypes = settings.knownTypes; @@ -1603,44 +1653,48 @@ function jsonMember(optionsOrPrototype, propKey) { var prototype = optionsOrPrototype; // For error messages. var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); - // jsonMember used directly, no additional information directly available besides target and propKey. + // jsonMember used directly, no additional information directly available besides target and + // propKey. // Obtain property constructor through ReflectDecorators. - if (isReflectMetadataSupported) { - var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); - if (!reflectPropCtor) { - logError(decoratorName + ": could not resolve detected property constructor at runtime. " + MISSING_REFLECT_CONF_MSG); - return; - } - var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); - if (isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(prototype, propKey, { - type: typeDescriptor, - key: propKey.toString(), - name: propKey.toString(), - }); + if (!isReflectMetadataSupported) { + logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is" + + " specified."); + return; } - else { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is specified."); + var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); + if (!reflectPropCtor) { + logError(decoratorName + ": could not resolve detected property constructor at runtime." + + MISSING_REFLECT_CONF_MSG); return; } + var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { + return; + } + injectMetadataInformation(prototype, propKey, { + type: typeDescriptor, + key: propKey.toString(), + name: propKey.toString(), + }); } else { // jsonMember used as a decorator factory. return function (target, _propKey) { var options = optionsOrPrototype || {}; var typeDescriptor; - var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); // For error messages. + var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); if (options.hasOwnProperty('constructor')) { if (!isValueDefined(options.constructor)) { - logError(decoratorName + ": cannot resolve specified property constructor at runtime."); + logError(decoratorName + ": cannot resolve specified property constructor at" + + ' runtime.'); return; } - // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. + // Property constructor has been specified. Use ReflectDecorators (if available) to + // check whether that constructor is correct. Warn if not. typeDescriptor = ensureTypeDescriptor(options.constructor); if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { - logWarning(decoratorName + ": detected property type does not match 'constructor' option."); + logWarning(decoratorName + ": detected property type does not match" + + " 'constructor' option."); } } else { @@ -1648,13 +1702,15 @@ function jsonMember(optionsOrPrototype, propKey) { if (isReflectMetadataSupported) { var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); if (!reflectCtor) { - logError(decoratorName + ": cannot resolve detected property constructor at runtime."); + logError(decoratorName + ": cannot resolve detected property constructor at" + + " runtime."); return; } typeDescriptor = ensureTypeDescriptor(reflectCtor); } else if (!options.deserializer) { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is specified."); + logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option" + + " is specified."); return; } } @@ -1701,19 +1757,23 @@ function isSpecialPropertyType(decoratorName, typeDescriptor) { /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set). + * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' + * for Set). * @param options Additional options. */ function jsonSetMember(elementConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { - var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. + // For error messages + var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(elementConstructor)) { logError(decoratorName + ": could not resolve constructor of set elements at runtime."); return; } - // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) { + // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used + // on a set. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Set) { logError(decoratorName + ": property is not a Set. " + MISSING_REFLECT_CONF_MSG); return; } @@ -1745,7 +1805,8 @@ function jsonSetMember(elementConstructor, options) { function jsonMapMember(keyConstructor, valueConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { - var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); // For error messages. + // For error messages + var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(keyConstructor)) { logError(decoratorName + ": could not resolve constructor of map keys at runtime."); return; @@ -1754,8 +1815,10 @@ function jsonMapMember(keyConstructor, valueConstructor, options) { logError(decoratorName + ": could not resolve constructor of map values at runtime."); return; } - // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Map) { + // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used + // on a map. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Map) { logError(decoratorName + ": property is not a Map. " + MISSING_REFLECT_CONF_MSG); return; } diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 4563a82..50be41a 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\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 type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) {\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined {\n if (sourceObject.__type) {\nreturn knownTypes.get(sourceObject.__type);\n}\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) {\n const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`),\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 | TypeDescriptor, options: IJsonArrayMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\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 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 logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`,\n));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`,\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\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 this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`,\n);\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(object: Array>>>, dimensions: 4): Array>>>;\n toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor));\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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 const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function;\n\n if (!reflectCtor) {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\n 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 (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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 logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`);\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName\n = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings) {\n this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`\n );\n return;\n }\n\n const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.`\n + MISSING_REFLECT_CONF_MSG,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function;\n\n if (!reflectCtor) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`\n );\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 58be7ff..10873d6 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ // [typedjson] Version: 1.6.0-rc2 - 2020-08-26 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 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: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) {\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages.\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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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 const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor {\n return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options);\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined {\n if (sourceObject.__type) {\nreturn knownTypes.get(sourceObject.__type);\n}\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map, DeserializerFn>([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions);\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) {\n const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(\n new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`),\n );\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 // check for member first\n if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n // check for static\n else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`),\n );\n return [];\n }\n\n return sourceObject.map(element => {\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 return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\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 if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName);\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName);\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 | TypeDescriptor, options: IJsonArrayMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\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 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 logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map, SerializerFn>([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`,\n));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n if (sourceTypeMetadata.beforeSerializationMethodName) {\n // check for member first\n if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n }\n // check for static\n else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') {\n (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`,\n ));\n }\n }\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),\n // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject',\n // which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(\n element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions),\n );\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions);\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use`\n + ' proper annotation or function for this type');\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions),\n value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\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\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\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 this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`,\n);\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(object: Array>>>, dimensions: 4): Array>>>;\n toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor));\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional\n * settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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\n * 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(prototype: IndexedObject, propertyKey: string | symbol): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.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 const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\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 typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function;\n\n if (!reflectCtor) {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(elementConstructor)) {\n 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 (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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 logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","undefined","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","methodName","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","resultSet","i","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`);\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName\n = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings) {\n this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`\n );\n return;\n }\n\n const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.`\n + MISSING_REFLECT_CONF_MSG,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function;\n\n if (!reflectCtor) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`\n );\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts index f0f73da..981895a 100644 --- a/js/typedjson/helpers.d.ts +++ b/js/typedjson/helpers.d.ts @@ -1,9 +1,11 @@ import { Serializable } from './types'; export declare const MISSING_REFLECT_CONF_MSG: string; /** - * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. + * Determines whether the specified type is a type that can be passed on "as-is" into + * `JSON.stringify`. * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`). + * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` + * for `number`). */ export declare function isDirectlySerializableNativeType(type: Function): boolean; export declare function isDirectlyDeserializableNativeType(type: Function): boolean; diff --git a/js/typedjson/json-array-member.d.ts b/js/typedjson/json-array-member.d.ts index dea7b47..69a3b76 100644 --- a/js/typedjson/json-array-member.d.ts +++ b/js/typedjson/json-array-member.d.ts @@ -9,14 +9,18 @@ export interface IJsonArrayMemberOptions extends OptionsBase { dimensions?: number; /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ serializer?: (value: any) => any; } /** * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * for 'Date[]'). * @param options Additional options. */ export declare function jsonArrayMember(elementConstructor: Function | TypeDescriptor, options?: IJsonArrayMemberOptions): (target: Object, propKey: string | symbol) => void; diff --git a/js/typedjson/json-map-member.d.ts b/js/typedjson/json-map-member.d.ts index 677372e..e4ab267 100644 --- a/js/typedjson/json-map-member.d.ts +++ b/js/typedjson/json-map-member.d.ts @@ -7,7 +7,10 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial emitDefaultValue?: boolean; /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ serializer?: (value: any) => any; diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts index 912bfc1..7ac5a7b 100644 --- a/js/typedjson/json-member.d.ts +++ b/js/typedjson/json-member.d.ts @@ -13,20 +13,24 @@ export interface IJsonMemberOptions extends OptionsBase { emitDefaultValue?: boolean; /** When set, the key on the JSON that should be used instead of the class property name. */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ serializer?: (value: any) => any; } /** * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly - * declared. + * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always + * explicitly declared. * @param options Additional options. */ export declare function jsonMember(options: IJsonMemberOptions): PropertyDecorator; /** * Specifies that a property is part of the object when serializing. - * This call signature requires ReflectDecorators and that the property type is always explicitly declared. + * This call signature requires ReflectDecorators and that the property type is always explicitly + * declared. */ export declare function jsonMember(prototype: IndexedObject, propertyKey: string | symbol): void; diff --git a/js/typedjson/json-object.d.ts b/js/typedjson/json-object.d.ts index c8f0994..1aedc17 100644 --- a/js/typedjson/json-object.d.ts +++ b/js/typedjson/json-object.d.ts @@ -8,7 +8,8 @@ export interface IJsonObjectOptionsBase extends OptionsBase { */ knownTypes?: Array; /** - * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. + * A function that will emit a type hint on the resulting JSON. It will override the global + * typeEmitter. */ typeHintEmitter?: TypeHintEmitter; /** @@ -50,8 +51,8 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase { initializer?: InitializerCallback; } /** - * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional - * settings. The 'initializer' setting must be specified. + * Marks that a class with a parameterized constructor is serializable using TypedJSON, with + * additional settings. The 'initializer' setting must be specified. * @param options Configuration settings. */ export declare function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => void; diff --git a/js/typedjson/json-set-member.d.ts b/js/typedjson/json-set-member.d.ts index 0b9a3e0..82b4312 100644 --- a/js/typedjson/json-set-member.d.ts +++ b/js/typedjson/json-set-member.d.ts @@ -6,7 +6,10 @@ export interface IJsonSetMemberOptions extends OptionsBase { emitDefaultValue?: boolean; /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ serializer?: (value: any) => any; @@ -14,7 +17,8 @@ export interface IJsonSetMemberOptions extends OptionsBase { /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set). + * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' + * for Set). * @param options Additional options. */ export declare function jsonSetMember(elementConstructor: Function, options?: IJsonSetMemberOptions): (target: Object, propKey: string | symbol) => void; diff --git a/js/typedjson/serializer.d.ts b/js/typedjson/serializer.d.ts index f41f579..f2e3c2a 100644 --- a/js/typedjson/serializer.d.ts +++ b/js/typedjson/serializer.d.ts @@ -5,7 +5,8 @@ import { IndexedObject } from './types'; export declare function defaultTypeEmitter(targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata): void; /** * @param sourceObject The original object that should be serialized. - * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization. + * @param typeDescriptor Instance of TypeDescriptor containing information about expected + * serialization. * @param memberName Name of the object being serialized, used for debugging purposes. * @param serializer Serializer instance, aiding with recursive serialization. * @param memberOptions If converted as a member, the member options. diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 6b7c7b6..5e60762 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -47,7 +47,8 @@ describe('array of objects', () => { expect(result.length).toBe(3, 'Deserialized array is of wrong length'); result.forEach((obj, index) => { expect(obj instanceof Simple).toBeTruthy(`${index} was not of type Simple`); - expect(obj).toHaveProperties(expectation[index], '${index} was deserialized incorrectly'); + expect(obj) + .toHaveProperties(expectation[index], '${index} was deserialized incorrectly'); }); }); @@ -150,7 +151,8 @@ describe('multidimensional arrays', () => { } it('deserializes', () => { - const result = TypedJSON.parseAsArray(JSON.stringify(createTestArray(false)), WithArrays, undefined, 2); + const testArray = JSON.stringify(createTestArray(false)); + const result = TypedJSON.parseAsArray(testArray, WithArrays, undefined, 2); expect(result).toBeOfLength(4); expect(result[0]).toBeOfLength(0); diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 2ed3a67..ab503a4 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -8,7 +8,8 @@ describe('basic serialization of', () => { 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)); + 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); @@ -20,8 +21,10 @@ describe('basic serialization of', () => { expect(TypedJSON.stringify('str', String)).toEqual('"str"'); expect(TypedJSON.stringify(45834, Number)).toEqual('45834'); expect(TypedJSON.stringify(true, Boolean)).toEqual('true'); - expect(TypedJSON.stringify(new Date(1543915254), Date)).toEqual(`"${new Date(1543915254).toISOString()}"`); - expect(TypedJSON.stringify(new Date('2018-12-04T09:20:54'), Date)).toEqual(`"${new Date('2018-12-04T09:20:54').toISOString()}"`); + expect(TypedJSON.stringify(new Date(1543915254), Date)) + .toEqual(`"${new Date(1543915254).toISOString()}"`); + expect(TypedJSON.stringify(new Date('2018-12-04T09:20:54'), Date)) + .toEqual(`"${new Date('2018-12-04T09:20:54').toISOString()}"`); const buffer = new ArrayBuffer(4); const view = new DataView(buffer); @@ -31,7 +34,8 @@ describe('basic serialization of', () => { view.setInt8(3, 97); expect(TypedJSON.stringify(buffer, ArrayBuffer)).toEqual('"畤慰"'); expect(TypedJSON.stringify(view, DataView)).toEqual('"畤慰"'); - expect(TypedJSON.stringify(new Uint8Array(buffer), Uint8Array)).toEqual('[100,117,112,97]'); + expect(TypedJSON.stringify(new Uint8Array(buffer), Uint8Array)) + .toEqual('[100,117,112,97]'); }); }); diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index f9d684f..c4898c7 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -33,14 +33,17 @@ describe('custom member deserializer', () => { }); it('should not affect serialization', function () { - expect(TypedJSON.stringify(this.person, Person)).toBe('{"firstName":"John","lastName":"Doe"}'); + expect(TypedJSON.stringify(this.person, Person)) + .toBe('{"firstName":"John","lastName":"Doe"}'); }); }); describe('custom array member deserializer', () => { @jsonObject class Obj { - @jsonArrayMember(Number, {deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10))}) + @jsonArrayMember(Number, { + deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10)), + }) nums: Array; @jsonMember @@ -85,7 +88,9 @@ describe('custom delegating array member serializer', () => { } } - function objArrayDeserializer(values: Array<{prop: string; shouldDeserialize: boolean}> | undefined) { + function objArrayDeserializer( + values: Array<{prop: string; shouldDeserialize: boolean}> | undefined, + ) { if (values) { return TypedJSON.parseAsArray( values.filter(value => value.shouldDeserialize), diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index 9bc138e..b9ef5f0 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -1,11 +1,17 @@ beforeEach(() => { jasmine.addMatchers({ toHaveProperties(util, customEqualityMatchers): jasmine.CustomMatcher { - function equalOnPropNames(actual: T, expected: Array): boolean { + function equalOnPropNames( + actual: T, + expected: Array, + ): boolean { return expected.every(prop => prop in actual); } - function equalOnPropValues(actual: T, expected: Partial): boolean { + function equalOnPropValues( + actual: T, + expected: Partial, + ): boolean { return Object.keys(expected) .every( key => key in actual @@ -31,7 +37,13 @@ beforeEach(() => { return { pass, - message: util.buildFailureMessage(name, pass, actual, expected, ...customMsgs), + message: util.buildFailureMessage( + name, + pass, + actual, + expected, + ...customMsgs, + ), }; }, }; @@ -46,7 +58,13 @@ beforeEach(() => { const pass = actual instanceof expected; return { pass, - message: util.buildFailureMessage('To be instance of', pass, actual, expected, ...customMsgs), + message: util.buildFailureMessage( + 'To be instance of', + pass, + actual, + expected, + ...customMsgs, + ), }; }, }; @@ -61,7 +79,13 @@ beforeEach(() => { const pass = actual && actual.length === expected; return { pass, - message: util.buildFailureMessage('To be of length', pass, actual, expected, ...customMsgs), + message: util.buildFailureMessage( + 'To be of length', + pass, + actual, + expected, + ...customMsgs, + ), }; }, }; @@ -93,7 +117,10 @@ function tryAsInt8Array(obj: any): Int8Array | undefined { declare namespace jasmine { /* eslint-disable @typescript-eslint/method-signature-style */ interface Matchers { - toHaveProperties(expectation: Partial | Array, ...expectationFailOutput: Array): boolean; + toHaveProperties( + expectation: Partial | Array, + ...expectationFailOutput: Array, + ): boolean; toBeInstanceOf(expectation: Function, ...expectationFailOutput: Array): boolean; } interface ArrayLikeMatchers extends Matchers> { diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index 9821c45..a81d384 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -49,7 +49,8 @@ describe('json (without automatic stringify)', () => { 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]); + expect(TypedJSON.toPlainJson(new Uint8Array(buffer), Uint8Array)) + .toEqual([100, 117, 112, 97]); }); }); @@ -75,12 +76,15 @@ describe('json (without automatic stringify)', () => { it('should deserialize', () => { expect(TypedJSON.parse(json, SomeThing)).toEqual(Object.assign(new SomeThing(), json)); - expect(TypedJSON.parseAsArray([json], SomeThing)).toEqual([Object.assign(new SomeThing(), json)]); + expect(TypedJSON.parseAsArray([json], SomeThing)) + .toEqual([Object.assign(new SomeThing(), json)]); }); it('should serialize', () => { - expect(TypedJSON.toPlainJson(Object.assign(new SomeThing(), json), SomeThing)).toEqual(json); - expect(TypedJSON.toPlainArray([Object.assign(new SomeThing(), json)], SomeThing)).toEqual([json]); + expect(TypedJSON.toPlainJson(Object.assign(new SomeThing(), json), SomeThing)) + .toEqual(json); + expect(TypedJSON.toPlainArray([Object.assign(new SomeThing(), json)], SomeThing)) + .toEqual([json]); }); }); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index b6d967e..dad96b5 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -138,7 +138,10 @@ describe('map of array dictionary shape', () => { const object = new DictArrayMap(); object.prop = new Map>([ ['one', [new Simple({strProp: 'delta', numProp: 4})]], - ['two', [new Simple({strProp: 'gamma', numProp: 7}), new Simple({strProp: 'alpha', numProp: 2})]], + ['two', [ + new Simple({strProp: 'gamma', numProp: 7}), + new Simple({strProp: 'alpha', numProp: 2}), + ]], ]); const result = TypedJSON.stringify(object, DictArrayMap); diff --git a/spec/parse-to-object.spec.ts b/spec/parse-to-object.spec.ts index ae008bd..bf9d47b 100644 --- a/spec/parse-to-object.spec.ts +++ b/spec/parse-to-object.spec.ts @@ -41,7 +41,8 @@ describe('parse To Object', () => { 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)) + .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('畤慰'); diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 2821dcd..ecd83f0 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -93,7 +93,12 @@ describe('polymorphic custom names', () => { break; case 2: - company.owner = new PartTimeEmployee('John', 'White', 160000, new Date(1992, 5, 27)); + company.owner = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); break; diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index f3bbe0b..15c8758 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -6,7 +6,9 @@ describe('polymorphism custom type hints', () => { let TYPE_MAP: IndexedObject; @jsonObject({ - typeHintEmitter: (targetObject, sourceObject) => targetObject.personType = `${sourceObject.constructor.name}Type`, + typeHintEmitter: (targetObject, sourceObject) => { + return targetObject.personType = `${sourceObject.constructor.name}Type`; + }, typeResolver: sourceObject => TYPE_MAP[sourceObject.personType], }) abstract class Person { @@ -99,9 +101,19 @@ describe('polymorphism custom type hints', () => { const json = TypedJSON.toPlainJson(company, Company); expect(json).toEqual({ name: 'Json Types', - owner: {personType: 'InvestorType', firstName: 'John', lastName: 'White', investAmount: 1700000}, + owner: { + personType: 'InvestorType', + firstName: 'John', + lastName: 'White', + investAmount: 1700000, + }, employees: [ - {personType: 'EmployeeType', firstName: 'Donn', lastName: 'Worker', salary: 240000}, + { + personType: 'EmployeeType', + firstName: 'Donn', + lastName: 'Worker', + salary: 240000, + }, { personType: 'PartTimeEmployeeType', firstName: 'Abe', @@ -109,7 +121,12 @@ describe('polymorphism custom type hints', () => { salary: 160000, workHours: 20, }, - {personType: 'EmployeeType', firstName: 'Smith', lastName: 'Elly', salary: 35500}, + { + personType: 'EmployeeType', + firstName: 'Smith', + lastName: 'Elly', + salary: 35500, + }, ], }); }); @@ -117,9 +134,19 @@ describe('polymorphism custom type hints', () => { it('should resolve custom hints', () => { const json = { name: 'Json Types', - owner: {personType: 'InvestorType', firstName: 'John', lastName: 'White', investAmount: 1700000}, + owner: { + personType: 'InvestorType', + firstName: 'John', + lastName: 'White', + investAmount: 1700000, + }, employees: [ - {personType: 'EmployeeType', firstName: 'Donn', lastName: 'Worker', salary: 240000}, + { + personType: 'EmployeeType', + firstName: 'Donn', + lastName: 'Worker', + salary: 240000, + }, { personType: 'PartTimeEmployeeType', firstName: 'Abe', @@ -127,7 +154,12 @@ describe('polymorphism custom type hints', () => { salary: 160000, workHours: 20, }, - {personType: 'EmployeeType', firstName: 'Smith', lastName: 'Elly', salary: 35500}, + { + personType: 'EmployeeType', + firstName: 'Smith', + lastName: 'Elly', + salary: 35500, + }, ], }; @@ -155,8 +187,12 @@ describe('polymorphism custom type hints', () => { } @jsonObject({ - typeHintEmitter: (targetObject, sourceObject) => targetObject.type = (sourceObject.constructor as any).type, - typeResolver: sourceObject => sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne, + typeHintEmitter: (targetObject, sourceObject) => { + targetObject.type = (sourceObject.constructor as any).type; + }, + typeResolver: sourceObject => { + return sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne; + }, }) abstract class SemanticBaseOne extends StructuralBase { @jsonMember @@ -178,8 +214,12 @@ describe('polymorphism custom type hints', () => { } @jsonObject({ - typeHintEmitter: (targetObject, sourceObject) => targetObject.hint = sourceObject instanceof ConcreteTwo ? 'first' : 'another', - typeResolver: sourceObject => sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo, + typeHintEmitter: (targetObject, sourceObject) => { + targetObject.hint = sourceObject instanceof ConcreteTwo ? 'first' : 'another'; + }, + typeResolver: sourceObject => { + return sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo; + }, }) abstract class SemanticBaseTwo extends StructuralBase { @jsonMember diff --git a/spec/polymorphism-root-abstract-class.spec.ts b/spec/polymorphism-root-abstract-class.spec.ts index 8b14fd2..2dacf51 100644 --- a/spec/polymorphism-root-abstract-class.spec.ts +++ b/spec/polymorphism-root-abstract-class.spec.ts @@ -28,7 +28,10 @@ describe('single class', () => { describe('deserialized', () => { beforeAll(function () { - this.person = TypedJSON.parse('{ "__type": "Bob", "firstName": "John", "lastName": "Doe", "pounds": 40 }', Person); + this.person = TypedJSON.parse( + '{ "__type": "Bob", "firstName": "John", "lastName": "Doe", "pounds": 40 }', + Person, + ); }); it('should be of proper type', function () { diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 0642a76..f3c7c11 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -93,7 +93,12 @@ describe('polymorphism', () => { break; case 2: - company.owner = new PartTimeEmployee('John', 'White', 160000, new Date(1992, 5, 27)); + company.owner = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); break; diff --git a/spec/preserveNull.spec.ts b/spec/preserveNull.spec.ts index 61a85c2..255e4fe 100644 --- a/spec/preserveNull.spec.ts +++ b/spec/preserveNull.spec.ts @@ -182,10 +182,17 @@ describe('preserveNull', () => { ]); const json = TypedJSON.stringify(input, Person); expect(json).toEqual( - '{"map":[{"key":"one","value":null},{"key":"two","value":null},{"key":"three","value":"val"}]}', + '{"map":[{"key":"one","value":null},{"key":"two","value":null},' + + '{"key":"three","value":"val"}]}', ); const obj = TypedJSON.parse( - {map: [{key: 'one', value: null}, {key: 'two', value: null}, {key: 'three', value: 'val'}]}, + { + map: [ + {key: 'one', value: null}, + {key: 'two', value: null}, + {key: 'three', value: 'val'}, + ], + }, Person, ); expect(obj).toEqual(input); diff --git a/spec/set.spec.ts b/spec/set.spec.ts index b5335da..40bb327 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -47,7 +47,8 @@ describe('set of objects', () => { expect(result.size).toBe(3, 'Deserialized set is of wrong size'); result.forEach((obj) => { expect(obj).toBeInstanceOf(Simple); - expect(obj).toHaveProperties(expectation.find((expected) => expected.strProp === obj.strProp)); + expect(obj) + .toHaveProperties(expectation.find((expected) => expected.strProp === obj.strProp)); }); }); @@ -58,7 +59,8 @@ describe('set of objects', () => { {strProp: 'gamma', numProp: 0}, ]; - const result = TypedJSON.stringifyAsSet(new Set(expectation.map(obj => new Simple(obj))), Simple); + const set = new Set(expectation.map(obj => new Simple(obj))); + const result = TypedJSON.stringifyAsSet(set, Simple); expect(result).toBe(JSON.stringify(expectation)); }); @@ -76,7 +78,8 @@ describe('set member', () => { } it('deserializes', () => { - const result = TypedJSON.parse(JSON.stringify({prop: [Everything.create(), Everything.create()]}), WithSet); + const object = {prop: [Everything.create(), Everything.create()]}; + const result = TypedJSON.parse(JSON.stringify(object), WithSet); expect(result).toBeInstanceOf(WithSet); expect(result.prop).toBeDefined(); @@ -130,23 +133,23 @@ describe('set array member', () => { it('deserializes', () => { const result = TypedJSON.parse( -JSON.stringify( - { -prop: [ - [ - {strProp: 'delta', numProp: 4}, - {strProp: 'bravo', numProp: 2}, - {strProp: 'gamma', numProp: 0}, - ], - [ - {strProp: 'alpha', numProp: 3245}, - {strProp: 'zeta', numProp: 4358}, + JSON.stringify( + { + prop: [ + [ + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, + ], + [ + {strProp: 'alpha', numProp: 3245}, + {strProp: 'zeta', numProp: 4358}, + ], ], - ], - }, -), + }, + ), WithSet, -); + ); expect(result).toBeInstanceOf(WithSet); expect(result.prop).toBeDefined(); @@ -159,7 +162,10 @@ prop: [ new Simple({strProp: 'bravo', numProp: 2}), new Simple({strProp: 'gamma', numProp: 0}), ], - [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], + [ + new Simple({strProp: 'alpha', numProp: 3245}), + new Simple({strProp: 'zeta', numProp: 4358}), + ], ]); }); @@ -167,11 +173,33 @@ prop: [ const object = new WithSet(); object.prop = new Set>([ [new Simple({strProp: 'delta', numProp: 4})], - [new Simple({strProp: 'alpha', numProp: 3245}), new Simple({strProp: 'zeta', numProp: 4358})], + [ + new Simple({strProp: 'alpha', numProp: 3245}), + new Simple({strProp: 'zeta', numProp: 4358}), + ], ]); const result = TypedJSON.stringify(object, WithSet); - expect(result).toBe(JSON.stringify({prop: [[{strProp: 'delta', numProp: 4}], [{strProp: 'alpha', numProp: 3245}, {strProp: 'zeta', numProp: 4358}]]})); + expect(result).toBe(JSON.stringify({ + prop: [ + [ + { + strProp: 'delta', + numProp: 4, + }, + ], + [ + { + strProp: 'alpha', + numProp: 3245, + }, + { + strProp: 'zeta', + numProp: 4358, + }, + ], + ], + })); }); }); diff --git a/spec/utils/object-compare.ts b/spec/utils/object-compare.ts index 24800f1..bf8b962 100644 --- a/spec/utils/object-compare.ts +++ b/spec/utils/object-compare.ts @@ -5,7 +5,10 @@ export function isEqual(a: any, b: any): boolean { if (typeof a === 'object') { if (Object.keys(a).length !== Object.keys(b).length) { // 'b' has a different number of properties, and thus can no longer be considered equal. - console.warn(`Property count mismatch (a: ${Object.keys(a).length} keys, b: ${Object.keys(b).length} keys) on:`); + console.warn( + `Property count mismatch (a: ${Object.keys(a).length} keys,` + + ` b: ${Object.keys(b).length} keys) on:`, + ); console.warn(a); console.warn(b); return false; @@ -22,7 +25,9 @@ export function isEqual(a: any, b: any): boolean { } else if (a instanceof Array && b instanceof Array) { if (a.length !== b.length) { // 'b' has a different number of elements, not equal. - console.warn(`Array length mismatch (a: ${a.length} elements, b: ${b.length} elements) on:`); + console.warn( + `Array length mismatch (a: ${a.length} elements, b: ${b.length} elements) on:`, + ); console.warn(a); console.warn(b); return false; diff --git a/src/parser.ts b/src/parser.ts index 8b91a84..6576ccc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -49,7 +49,11 @@ export interface ITypedJSONSettings extends OptionsBase { export class TypedJSON { // #region Static - static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined { + static parse( + object: any, + rootType: Serializable, + settings?: ITypedJSONSettings, + ): T | undefined { return new TypedJSON(rootType, settings).parse(object); } @@ -92,7 +96,11 @@ export class TypedJSON { return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any); } - static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set { + static parseAsSet( + object: any, + elementType: Serializable, + settings?: ITypedJSONSettings, + ): Set { return new TypedJSON(elementType, settings).parseAsSet(object); } @@ -105,33 +113,63 @@ export class TypedJSON { return new TypedJSON(valueType, settings).parseAsMap(object, keyType); } - static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes { + static toPlainJson( + object: T, + rootType: Serializable, + settings?: ITypedJSONSettings, + ): JsonTypes { return new TypedJSON(rootType, settings).toPlainJson(object); } static toPlainArray( - object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, + object: Array, + elementType: Serializable, + dimensions?: 1, + settings?: ITypedJSONSettings, ): Array; static toPlainArray( - object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, + object: Array>, + elementType: Serializable, + dimensions: 2, + settings?: ITypedJSONSettings, ): Array>; static toPlainArray( - object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, + object: Array>>, + elementType: Serializable, + dimensions: 3, + settings?: ITypedJSONSettings, ): Array>>; static toPlainArray( - object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, + object: Array>>>, + elementType: Serializable, + dimensions: 4, settings?: ITypedJSONSettings, ): Array>>>; static toPlainArray( - object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, + object: Array>>>>, + elementType: Serializable, + dimensions: 5, + settings?: ITypedJSONSettings, ): Array>>>>; static toPlainArray( - object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, + object: Array, + elementType: Serializable, + dimensions: number, + settings?: ITypedJSONSettings, ): Array; - static toPlainArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): Array { + static toPlainArray( + object: Array, + elementType: Serializable, + dimensions?: any, + settings?: ITypedJSONSettings, + ): Array { return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); } - static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined { + static toPlainSet( + object: Set, + elementType: Serializable, + settings?: ITypedJSONSettings, + ): Array | undefined { return new TypedJSON(elementType, settings).toPlainSet(object); } @@ -144,33 +182,63 @@ export class TypedJSON { return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); } - static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string { + static stringify( + object: T, + rootType: Serializable, + settings?: ITypedJSONSettings, + ): string { return new TypedJSON(rootType, settings).stringify(object); } static stringifyAsArray( - object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings, + object: Array, + elementType: Serializable, + dimensions?: 1, + settings?: ITypedJSONSettings, ): string; static stringifyAsArray( - object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings, + object: Array>, + elementType: Serializable, + dimensions: 2, + settings?: ITypedJSONSettings, ): string; static stringifyAsArray( - object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings, + object: Array>>, + elementType: Serializable, + dimensions: 3, + settings?: ITypedJSONSettings, ): string; static stringifyAsArray( - object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings, + object: Array>>>, + elementType: Serializable, + dimensions: 4, + settings?: ITypedJSONSettings, ): string; static stringifyAsArray( - object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings, + object: Array>>>>, + elementType: Serializable, + dimensions: 5, + settings?: ITypedJSONSettings, ): string; static stringifyAsArray( - object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings, + object: Array, + elementType: Serializable, + dimensions: number, settings?: ITypedJSONSettings, ): string; - static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: any, settings?: ITypedJSONSettings): string { + static stringifyAsArray( + object: Array, + elementType: Serializable, + dimensions?: any, + settings?: ITypedJSONSettings, + ): string { return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); } - static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string { + static stringifyAsSet( + object: Set, + elementType: Serializable, + settings?: ITypedJSONSettings, + ): string { return new TypedJSON(elementType, settings).stringifyAsSet(object); } @@ -213,8 +281,11 @@ export class TypedJSON { constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); - if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { - throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); + if (!rootMetadata + || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { + throw new TypeError( + 'The TypedJSON root data type must have the @jsonObject decorator used.', + ); } this.nameResolver = (ctor) => nameof(ctor); @@ -282,8 +353,9 @@ this.indent = settings.indent; // tslint:disable-next-line:no-null-keyword if (typeof knownType === 'undefined' || knownType === null) { logWarning( - `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`, -); + `TypedJSON.config: 'knownTypes' contains an undefined/null value` + + ` (element ${i}).`, + ); } }); @@ -379,11 +451,20 @@ json, toPlainArray(object: Array, dimensions?: 1): Array; toPlainArray(object: Array>, dimensions: 2): Array>; toPlainArray(object: Array>>, dimensions: 3): Array>>; - toPlainArray(object: Array>>>, dimensions: 4): Array>>>; - toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>; + toPlainArray( + object: Array>>>, + dimensions: 4, + ): Array>>>; + toPlainArray( + object: Array>>>>, + dimensions: 5, + ): Array>>>>; toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined { try { - return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); + return this.serializer.convertSingleValue( + object, + createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), + ); } catch (e) { this.errorHandler(e); } @@ -397,9 +478,15 @@ json, } } - toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ key: any; value: any }> | undefined { + toPlainMap( + object: Map, + keyConstructor: Serializable, + ): IndexedObject | Array<{ key: any; value: any }> | undefined { try { - return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); + return this.serializer.convertSingleValue( + object, + MapT(keyConstructor, this.rootConstructor), + ); } catch (e) { this.errorHandler(e); } diff --git a/src/typedjson.ts b/src/typedjson.ts index d5a808b..3849895 100644 --- a/src/typedjson.ts +++ b/src/typedjson.ts @@ -1,4 +1,10 @@ -export {TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter} from './parser'; +export { + TypedJSON, + ITypedJSONSettings, + JsonTypes, + defaultTypeResolver, + defaultTypeEmitter, +} from './parser'; export {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata'; export {jsonObject} from './typedjson/json-object'; export {jsonMember} from './typedjson/json-member'; diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index c54cee1..fa7f5c5 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -11,10 +11,13 @@ import { } from './type-descriptor'; import {Constructor, IndexedObject, Serializable} from './types'; -export function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined { +export function defaultTypeResolver( + sourceObject: IndexedObject, + knownTypes: Map, +): Function | undefined { if (sourceObject.__type) { -return knownTypes.get(sourceObject.__type); -} + return knownTypes.get(sourceObject.__type); + } } export type DeserializerFn = ( @@ -36,7 +39,10 @@ export class Deserializer { private typeResolver: TypeResolver = defaultTypeResolver; private nameResolver?: (ctor: Function) => string; private errorHandler: (error: Error) => void = logError; - private deserializationStrategy = new Map, DeserializerFn>([ + private deserializationStrategy = new Map< + Serializable, + DeserializerFn + >([ // primitives [Number, deserializeDirectly], [String, deserializeDirectly], @@ -102,7 +108,14 @@ export class Deserializer { const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); if (deserializer) { - return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); + return deserializer( + sourceObject, + typeDescriptor, + knownTypes, + memberName, + this, + memberOptions, + ); } if (typeof sourceObject === 'object') { @@ -173,11 +186,18 @@ function throwTypeMismatchError( ); } -function makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName: string) { - const expectedTypeName = typeof expectedType === 'function' ? nameof(expectedType) : expectedType; +function makeTypeErrorMessage( + expectedType: Function | string, + actualType: Function | string, + memberName: string, +) { + const expectedTypeName = typeof expectedType === 'function' + ? nameof(expectedType) + : expectedType; const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; - return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`; + return `Could not deserialize ${memberName}: expected '${expectedTypeName}',` + + ` got '${actualTypeName}'.`; } function srcTypeNameForDebug(sourceObject: any) { @@ -191,7 +211,11 @@ function deserializeDirectly( objectName: string, ): T { if (sourceObject.constructor !== typeDescriptor.ctor) { - throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); + throw new TypeError(makeTypeErrorMessage( + nameof(typeDescriptor.ctor), + sourceObject.constructor, + objectName, + )); } return sourceObject; } @@ -204,9 +228,9 @@ function convertAsObject( deserializer: Deserializer, ): IndexedObject | T | undefined { if (typeof sourceObject !== 'object' || sourceObject === null) { - deserializer.getErrorHandler()( - new TypeError(`Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`), - ); + deserializer.getErrorHandler()(new TypeError( + `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`, + )); return undefined; } @@ -283,7 +307,9 @@ function convertAsObject( ) { sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue; } else if (objMemberMetadata.isRequired) { - deserializer.getErrorHandler()(new TypeError(`Missing required member '${objMemberDebugName}'.`)); + deserializer.getErrorHandler()(new TypeError( + `Missing required member '${objMemberDebugName}'.`, + )); } }); @@ -325,17 +351,18 @@ function convertAsObject( Object.assign(targetObject, sourceObjectWithDeserializedProperties); // Call onDeserialized method (if any). - if (sourceObjectMetadata.onDeserializedMethodName) { - // check for member first - if (typeof (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') { - (targetObject as any)[sourceObjectMetadata.onDeserializedMethodName](); - } - // check for static - else if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === 'function') { - (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName](); + const methodName = sourceObjectMetadata.onDeserializedMethodName; + if (methodName) { + if (typeof (targetObject as any)[methodName] === 'function') { + // check for member first + (targetObject as any)[methodName](); + } else if (typeof (targetObject.constructor as any)[methodName] === 'function') { + // check for static + (targetObject.constructor as any)[methodName](); } else { deserializer.getErrorHandler()(new TypeError( - `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`, + `onDeserialized callback` + + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`, )); } } @@ -367,8 +394,10 @@ function convertAsArray( memberOptions?: OptionsBase, ): Array { if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError(`Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,` + + ' please use proper annotation or function for this type', + ); } if (!Array.isArray(sourceObject)) { deserializer.getErrorHandler()( @@ -379,13 +408,17 @@ function convertAsArray( if (!typeDescriptor.elementType) { deserializer.getErrorHandler()( - new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`), + new TypeError( + `Could not deserialize ${memberName} as Array: missing constructor reference of` + + ` Array elements.`, + ), ); return []; } return sourceObject.map(element => { - // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty + // If an array element fails to deserialize, substitute with undefined. This is so that the + // original ordering is not interrupted by faulty // entries, as an Array is ordered. try { return deserializer.convertSingleValue( @@ -414,17 +447,26 @@ function convertAsSet( memberOptions?: OptionsBase, ): Set { if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError(`Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,` + + ` please use proper annotation or function for this type`, + ); } if (!Array.isArray(sourceObject)) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage( + Array, + sourceObject.constructor, + memberName, + ))); return new Set(); } if (!typeDescriptor.elementType) { deserializer.getErrorHandler()( - new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`), + new TypeError( + `Could not deserialize ${memberName} as Set: missing constructor reference of` + + ` Set elements.`, + ), ); return new Set(); } @@ -464,8 +506,10 @@ function convertAsMap( memberOptions?: OptionsBase, ): Map { if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError(`Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,` + + 'please use proper annotation or function for this type', + ); } const expectedShape = typeDescriptor.getCompleteOptions().shape; if (!isExpectedMapShape(sourceObject, expectedShape)) { @@ -561,15 +605,22 @@ function deserializeDate( knownTypes: Map, memberName: string, ): Date { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch). + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since + // the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === 'string' || (typeof sourceObject === 'number' && sourceObject > 0)) { + if (typeof sourceObject === 'string' + || (typeof sourceObject === 'number' && sourceObject > 0)) { return new Date(sourceObject as any); } else if (sourceObject instanceof Date) { return sourceObject; } else { - throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); + throwTypeMismatchError( + 'Date', + 'an ISO-8601 string', + srcTypeNameForDebug(sourceObject), + memberName, + ); } } @@ -580,7 +631,12 @@ function stringToArrayBuffer( memberName: string, ) { if (typeof sourceObject !== 'string') { - throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + throwTypeMismatchError( + 'ArrayBuffer', + 'a string source', + srcTypeNameForDebug(sourceObject), + memberName, + ); } return createArrayBufferFromString(sourceObject); } @@ -592,7 +648,12 @@ function stringToDataView( memberName: string, ) { if (typeof sourceObject !== 'string') { - throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + throwTypeMismatchError( + 'DataView', + 'a string source', + srcTypeNameForDebug(sourceObject), + memberName, + ); } return new DataView(createArrayBufferFromString(sourceObject)); } diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 9ed54fa..b0d0401 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -8,9 +8,11 @@ export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "exper + ' and "emitDecoratorMetadata" in your tsconfig.json?'; /** - * Determines whether the specified type is a type that can be passed on "as-is" into `JSON.stringify`. + * Determines whether the specified type is a type that can be passed on "as-is" into + * `JSON.stringify`. * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`). + * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` + * for `number`). */ export function isDirectlySerializableNativeType(type: Function): boolean { return Boolean(~[Date, Number, String, Boolean].indexOf(type as any)); @@ -21,8 +23,17 @@ export function isDirectlyDeserializableNativeType(type: Function): boolean { } export function isTypeTypedArray(type: Function): boolean { - return Boolean(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array] - .indexOf(type as any)); + return Boolean(~[ + Float32Array, + Float64Array, + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + ].indexOf(type as any)); } export function isObject(value: any): value is Object { @@ -34,10 +45,13 @@ function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean || expectedType === ArrayBuffer || expectedType === DataView; - const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length - 1] === '"'; + const hasQuotes = jsonStr.length >= 2 + && jsonStr[0] === '"' + && jsonStr[jsonStr.length - 1] === '"'; const isInteger = /^\d+$/.test(jsonStr.trim()); - return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date); + return (expectsTypesSerializedAsStrings && !hasQuotes) + || ((!hasQuotes && !isInteger) && expectedType === Date); } export function parseToJSObject(json: any, expectedType: Serializable): Object { diff --git a/src/typedjson/json-array-member.ts b/src/typedjson/json-array-member.ts index d3c7281..c51884c 100644 --- a/src/typedjson/json-array-member.ts +++ b/src/typedjson/json-array-member.ts @@ -25,7 +25,10 @@ export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ @@ -34,15 +37,22 @@ export interface IJsonArrayMemberOptions extends OptionsBase { /** * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]'). + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * for 'Date[]'). * @param options Additional options. */ -export function jsonArrayMember(elementConstructor: Function | TypeDescriptor, options: IJsonArrayMemberOptions = {}) { +export function jsonArrayMember( + elementConstructor: Function | TypeDescriptor, + options: IJsonArrayMemberOptions = {}, +) { return (target: Object, propKey: string | symbol) => { - const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. + const decoratorName = + `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; if (!isTypelike(elementConstructor)) { - logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`); + logError( + `${decoratorName}: could not resolve constructor of array elements at runtime.`, + ); return; } @@ -52,8 +62,10 @@ export function jsonArrayMember(elementConstructor: Function | TypeDescriptor, o return; } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Array) { + // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been + // used on an array. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Array) { logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`); return; } @@ -71,7 +83,10 @@ export function jsonArrayMember(elementConstructor: Function | TypeDescriptor, o }; } -export function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor { +export function createArrayType( + elementType: TypeDescriptor, + dimensions: number, +): ArrayTypeDescriptor { let type = new ArrayTypeDescriptor(elementType); for (let i = 1; i < dimensions; ++i) { type = new ArrayTypeDescriptor(type); diff --git a/src/typedjson/json-map-member.ts b/src/typedjson/json-map-member.ts index 73bb0f6..89a46ea 100644 --- a/src/typedjson/json-map-member.ts +++ b/src/typedjson/json-map-member.ts @@ -17,7 +17,10 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ @@ -37,7 +40,8 @@ export function jsonMapMember( options: IJsonMapMemberOptions = {}, ) { return (target: Object, propKey: string | symbol) => { - const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. + // For error messages + const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; if (!isTypelike(keyConstructor)) { logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`); @@ -49,8 +53,10 @@ export function jsonMapMember( return; } - // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Map) { + // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used + // on a map. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Map) { logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index fff479d..42b6325 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -1,5 +1,11 @@ import { - isReflectMetadataSupported, isSubtypeOf, isValueDefined, logError, logWarning, MISSING_REFLECT_CONF_MSG, nameof, + isReflectMetadataSupported, + isSubtypeOf, + isValueDefined, + logError, + logWarning, + MISSING_REFLECT_CONF_MSG, + nameof, } from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; @@ -32,7 +38,10 @@ export interface IJsonMemberOptions extends OptionsBase { /** When set, the key on the JSON that should be used instead of the class property name. */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ @@ -41,17 +50,21 @@ export interface IJsonMemberOptions extends OptionsBase { /** * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly - * declared. + * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always + * explicitly declared. * @param options Additional options. */ export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; /** * Specifies that a property is part of the object when serializing. - * This call signature requires ReflectDecorators and that the property type is always explicitly declared. + * This call signature requires ReflectDecorators and that the property type is always explicitly + * declared. */ -export function jsonMember(prototype: IndexedObject, propertyKey: string | symbol): void; +export function jsonMember( + prototype: IndexedObject, + propertyKey: string | symbol, +): void; export function jsonMember( optionsOrPrototype?: IJsonMemberOptions | IndexedObject, @@ -62,60 +75,88 @@ export function jsonMember( // For error messages. const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; - // jsonMember used directly, no additional information directly available besides target and propKey. + // jsonMember used directly, no additional information directly available besides target and + // propKey. // Obtain property constructor through ReflectDecorators. - if (isReflectMetadataSupported) { - const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function; + if (!isReflectMetadataSupported) { + logError( + `${decoratorName}: ReflectDecorators is required if no 'constructor' option is` + + ` specified.`, + ); + return; + } - if (!reflectPropCtor) { - logError(`${decoratorName}: could not resolve detected property constructor at runtime. ${MISSING_REFLECT_CONF_MSG}`); - return; - } + const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function; - const typeDescriptor = ensureTypeDescriptor(reflectPropCtor); - if (isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } + if (!reflectPropCtor) { + logError( + `${decoratorName}: could not resolve detected property constructor at runtime.${ + MISSING_REFLECT_CONF_MSG}`, + ); + return; + } - injectMetadataInformation(prototype, propKey, { - type: typeDescriptor, - key: propKey.toString(), - name: propKey.toString(), - }); - } else { - logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`); + const typeDescriptor = ensureTypeDescriptor(reflectPropCtor); + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } + + injectMetadataInformation(prototype, propKey, { + type: typeDescriptor, + key: propKey.toString(), + name: propKey.toString(), + }); } else { // jsonMember used as a decorator factory. return (target: Object, _propKey: string | symbol) => { const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {}; let typeDescriptor: TypeDescriptor | undefined; - const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages. + const decoratorName = + `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; if (options.hasOwnProperty('constructor')) { if (!isValueDefined(options.constructor)) { - logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`); + logError( + `${decoratorName}: cannot resolve specified property constructor at` + + ' runtime.', + ); return; } - // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not. + // Property constructor has been specified. Use ReflectDecorators (if available) to + // check whether that constructor is correct. Warn if not. typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { - logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`); + if (isReflectMetadataSupported && !isSubtypeOf( + typeDescriptor.ctor, + Reflect.getMetadata('design:type', target, _propKey), + )) { + logWarning( + `${decoratorName}: detected property type does not match` + + ` 'constructor' option.`, + ); } } else { // Use ReflectDecorators to obtain property constructor. if (isReflectMetadataSupported) { - const reflectCtor = Reflect.getMetadata('design:type', target, _propKey) as Function; + const reflectCtor = Reflect.getMetadata( + 'design:type', + target, + _propKey, + ) as Function; if (!reflectCtor) { - logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`); + logError( + `${decoratorName}: cannot resolve detected property constructor at` + + ` runtime.`, + ); return; } typeDescriptor = ensureTypeDescriptor(reflectCtor); } else if (!options.deserializer) { - logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`); + logError( + `${decoratorName}: ReflectDecorators is required if no 'constructor' option` + + ` is specified.`, + ); return; } } diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index aa95707..ab2407e 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -11,7 +11,8 @@ export interface IJsonObjectOptionsBase extends OptionsBase { knownTypes?: Array; /** - * A function that will emit a type hint on the resulting JSON. It will override the global typeEmitter. + * A function that will emit a type hint on the resulting JSON. It will override the global + * typeEmitter. */ typeHintEmitter?: TypeHintEmitter; @@ -60,11 +61,13 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase { } /** - * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional - * settings. The 'initializer' setting must be specified. + * Marks that a class with a parameterized constructor is serializable using TypedJSON, with + * additional settings. The 'initializer' setting must be specified. * @param options Configuration settings. */ -export function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => void; +export function jsonObject( + options?: IJsonObjectOptionsWithInitializer, +): (target: Serializable) => void; /** * Marks that a class is serializable using TypedJSON, with additional settings. @@ -77,7 +80,9 @@ export function jsonObject(options?: IJsonObjectOptions): (target: Seriali */ export function jsonObject(target: Serializable): void; -export function jsonObject(optionsOrTarget?: IJsonObjectOptions | Serializable): ((target: Serializable) => void) | void { +export function jsonObject( + optionsOrTarget?: IJsonObjectOptions | Serializable, +): ((target: Serializable) => void) | void { let options: IJsonObjectOptions; if (typeof optionsOrTarget === 'function') { diff --git a/src/typedjson/json-set-member.ts b/src/typedjson/json-set-member.ts index 7386f19..624047d 100644 --- a/src/typedjson/json-set-member.ts +++ b/src/typedjson/json-set-member.ts @@ -17,7 +17,10 @@ export interface IJsonSetMemberOptions extends OptionsBase { /** When set, the key on the JSON that should be used instead of the class property name */ name?: string; - /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */ + /** + * When set, this deserializer will be used to deserialize the member. The callee must assure + * the correct type. + */ deserializer?: (json: any) => any; /** When set, this serializer will be used to serialize the member. */ @@ -27,20 +30,24 @@ export interface IJsonSetMemberOptions extends OptionsBase { /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set). + * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' + * for Set). * @param options Additional options. */ export function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) { return (target: Object, propKey: string | symbol) => { - const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages. + // For error messages + const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; if (!isTypelike(elementConstructor)) { logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`); return; } - // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not. - if (isReflectMetadataSupported && Reflect.getMetadata('design:type', target, propKey) !== Set) { + // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used + // on a set. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Set) { logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index c449623..be9dfaf 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -5,7 +5,10 @@ import {IndexedObject, Serializable} from './types'; export const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; -export type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null; +export type TypeResolver = ( + sourceObject: IndexedObject, + knownTypes: Map, +) => Function | undefined | null; export type TypeHintEmitter = ( targetObject: IndexedObject, @@ -90,10 +93,12 @@ export class JsonObjectMetadata { // Inherit json members and known types from parent @jsonObject (if any). const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY]; if (parentMetadata) { - parentMetadata.dataMembers - .forEach((memberMetadata, propKey) => objectMetadata.dataMembers.set(propKey, memberMetadata)); - parentMetadata.knownTypes - .forEach((knownType) => objectMetadata.knownTypes.add(knownType)); + parentMetadata.dataMembers.forEach((memberMetadata, propKey) => { + objectMetadata.dataMembers.set(propKey, memberMetadata); + }); + parentMetadata.knownTypes.forEach((knownType) => { + objectMetadata.knownTypes.add(knownType); + }); objectMetadata.typeResolver = parentMetadata.typeResolver; objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; } @@ -164,11 +169,19 @@ export class JsonObjectMetadata { initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; } -export function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata) { - const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; // For error messages. - - // When a property decorator is applied to a static member, 'constructor' is a constructor function. - // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators +export function injectMetadataInformation( + prototype: IndexedObject, + propKey: string | symbol, + metadata: JsonMemberMetadata, +) { + // For error messages + const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; + + // When a property decorator is applied to a static member, 'constructor' is a constructor + // function. + // See: + // eslint-disable-next-line max-len + // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. if (typeof prototype === 'function') { logError(`${decoratorName}: cannot use a static property.`); @@ -188,7 +201,8 @@ export function injectMetadataInformation(prototype: IndexedObject, propKey: str } // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). - // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well. + // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked + // with '@jsonObject' as well. const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype); if (!metadata.deserializer) { diff --git a/src/typedjson/options-base.ts b/src/typedjson/options-base.ts index cb54665..8a379da 100644 --- a/src/typedjson/options-base.ts +++ b/src/typedjson/options-base.ts @@ -16,7 +16,9 @@ const kAllOptions: Array = [ 'preserveNull', ]; -export function extractOptionBase(from: {[key: string]: any} & OptionsBase): OptionsBase | undefined { +export function extractOptionBase( + from: {[key: string]: any} & OptionsBase, +): OptionsBase | undefined { const options = Object.keys(from) .filter(key => (kAllOptions as Array).indexOf(key) > -1) .reduce((obj, key) => { diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 6cba4b9..edd80a8 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -25,7 +25,8 @@ export function defaultTypeEmitter( ) { // 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 will know what to deserialize into (given - // the required known-types are defined, and the object is a valid subtype of the expected type). + // the required known-types are defined, and the object is a valid subtype of the expected + // type). if (sourceObject.constructor !== expectedSourceType) { targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name ? sourceTypeMetadata.name @@ -35,7 +36,8 @@ export function defaultTypeEmitter( /** * @param sourceObject The original object that should be serialized. - * @param typeDescriptor Instance of TypeDescriptor containing information about expected serialization. + * @param typeDescriptor Instance of TypeDescriptor containing information about expected + * serialization. * @param memberName Name of the object being serialized, used for debugging purposes. * @param serializer Serializer instance, aiding with recursive serialization. * @param memberOptions If converted as a member, the member options. @@ -62,7 +64,10 @@ export class Serializer { options?: OptionsBase; private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter; private errorHandler: (error: Error) => void = logError; - private serializationStrategy = new Map, SerializerFn>([ + private serializationStrategy = new Map< + Serializable, + SerializerFn + >([ // primitives [Date, identity], [Number, identity], @@ -138,8 +143,9 @@ return; const actualName = nameof(sourceObject.constructor); this.errorHandler(new TypeError( - `Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`, -)); + `Could not serialize '${memberName}': expected '${expectedName}',` + + ` got '${actualName}'.`, + )); return; } @@ -153,7 +159,7 @@ return; } this.errorHandler(new TypeError( `Could not serialize '${memberName}': don't know how to serialize this type'.`, -)); + )); } } @@ -172,7 +178,8 @@ function convertAsObject( let targetObject: IndexedObject; let typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor && sourceObject instanceof typeDescriptor.ctor) { + if (sourceObject.constructor !== typeDescriptor.ctor + && sourceObject instanceof typeDescriptor.ctor) { // The source object is not of the expected type, but it is a valid subtype. // This is OK, and we'll proceed to gather object metadata from the subtype instead. sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor); @@ -181,26 +188,30 @@ function convertAsObject( } if (sourceTypeMetadata) { - if (sourceTypeMetadata.beforeSerializationMethodName) { - // check for member first - if (typeof (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { - (sourceObject as any)[sourceTypeMetadata.beforeSerializationMethodName](); - } - // check for static - else if (typeof (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName] === 'function') { - (sourceObject.constructor as any)[sourceTypeMetadata.beforeSerializationMethodName](); + const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; + if (beforeSerializationMethodName) { + if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') { + // check for member first + (sourceObject as any)[beforeSerializationMethodName](); + } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName] + === 'function') { + // check for static + (sourceObject.constructor as any)[beforeSerializationMethodName](); } else { serializer.getErrorHandler()(new TypeError( - `beforeSerialization callback '${nameof(sourceTypeMetadata.classType)}.${sourceTypeMetadata.beforeSerializationMethodName}' is not a method.`, + `beforeSerialization callback '` + + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}` + + `' is not a method.`, )); } } const sourceMeta = sourceTypeMetadata; // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), - // and perform recursive conversion on each of them. The converted objects are put on the 'targetObject', - // which is what will be put into 'JSON.stringify' finally. + // We'll serialize by members that have been marked with @jsonMember (including + // array/set/map members), and perform recursive conversion on each of them. The converted + // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' + // finally. targetObject = {}; const classOptions = mergeOptions(serializer.options, sourceMeta.options); @@ -235,7 +246,8 @@ function convertAsObject( }); } else { // Untyped serialization, "as-is", we'll just pass the object on. - // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify + // 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. targetObject = {...sourceObject}; } @@ -247,7 +259,8 @@ function convertAsObject( } /** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple + * javascript objects * (or primitive values) for serialization. */ function convertAsArray( @@ -258,11 +271,15 @@ function convertAsArray( memberOptions?: OptionsBase, ): Array { if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError(`Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please` + + ' use proper annotation or function for this type', + ); } if (!typeDescriptor.elementType) { - throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`); + throw new TypeError( + `Could not serialize ${memberName} as Array: missing element type definition.`, + ); } // Check the type of each element, individually. @@ -286,9 +303,14 @@ function convertAsArray( memberName += '[]'; } - return sourceObject.map( - element => serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions), - ); + return sourceObject.map(element => { + return serializer.convertSingleValue( + element, + typeDescriptor.elementType, + memberName, + memberOptions, + ); + }); } /** @@ -304,11 +326,15 @@ function convertAsSet( memberOptions?: OptionsBase, ): Array { if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError(`Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please` + + ' use proper annotation or function for this type', + ); } if (!typeDescriptor.elementType) { - throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`); + throw new TypeError( + `Could not serialize ${memberName} as Set: missing element type definition.`, + ); } // For debugging and error tracking. @@ -322,10 +348,16 @@ function convertAsSet( // The output array is the one serialized, as JSON.stringify does not support Set serialization. // (TODO: clarification needed) sourceObject.forEach(element => { - const resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + const resultElement = serializer.convertSingleValue( + element, + typeDescriptor.elementType, + memberName, + memberOptions, + ); // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became undefined + // This will add intentionally undefined values to output, but not values that became + // undefined // DURING serializing (usually because of a type-error). if (!isValueDefined(element) || isValueDefined(resultElement)) { resultArray.push(resultElement); @@ -347,15 +379,21 @@ function convertAsMap( memberOptions?: OptionsBase, ): IndexedObject | Array<{ key: any; value: any }> { if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError(`Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please use` - + ' proper annotation or function for this type'); + throw new TypeError( + `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please` + + ' use proper annotation or function for this type', + ); } if (!typeDescriptor.valueType) { - throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`); + throw new TypeError( + `Could not serialize ${memberName} as Map: missing value type definition.`, + ); } if (!typeDescriptor.keyType) { - throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`); + throw new TypeError( + `Could not serialize ${memberName} as Map: missing key type definition.`, + ); } if (memberName) { @@ -370,8 +408,18 @@ function convertAsMap( // Convert each *entry* in the map to a simple javascript object with key and value properties. sourceObject.forEach((value, key) => { const resultKeyValuePairObj = { - key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + key: serializer.convertSingleValue( + key, + typeDescriptor.keyType, + memberName, + memberOptions, + ), + value: serializer.convertSingleValue( + value, + typeDescriptor.valueType, + memberName, + memberOptions, + ), }; // We are not going to emit entries with undefined keys OR undefined values. @@ -404,7 +452,8 @@ function convertAsTypedArray(sourceObject: ArrayBufferView) { */ function convertAsArrayBuffer(buffer: ArrayBuffer) { // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(''); + return Array.from(new Uint16Array(buffer)) + .map(charCode => String.fromCharCode(charCode)).join(''); } /** diff --git a/src/typedjson/to-json.ts b/src/typedjson/to-json.ts index 12e42cf..f7571ac 100644 --- a/src/typedjson/to-json.ts +++ b/src/typedjson/to-json.ts @@ -23,7 +23,9 @@ export function toJson(target: Function): void; * @param options for configuring the toJSON creation. */ export function toJson(options: IToJsonOptions): ((target: Function) => void); -export function toJson(optionsOrTarget: IToJsonOptions | Function): ((target: Function) => void) | void { +export function toJson( + optionsOrTarget: IToJsonOptions | Function, +): ((target: Function) => void) | void { if (typeof optionsOrTarget === 'function') { // used directly toJsonDecorator(optionsOrTarget, {}); diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts index 69f9297..edbf251 100644 --- a/src/typedjson/type-descriptor.ts +++ b/src/typedjson/type-descriptor.ts @@ -87,8 +87,16 @@ export class MapTypeDescriptor extends GenericTypeDescriptor { } } -export function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor { - return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); +export function MapT( + keyType: Typelike, + valueType: Typelike, + options?: Partial, +): MapTypeDescriptor { + return new MapTypeDescriptor( + ensureTypeDescriptor(keyType), + ensureTypeDescriptor(valueType), + options, + ); } // TODO support for dictionary types ie. maps that are plain objects From e8b188e92f04baa04a8ab6b853ce35caa7f88b8e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 13:43:35 +0000 Subject: [PATCH 016/119] Unified signatures --- spec/array.spec.ts | 4 ---- spec/map.spec.ts | 4 ---- spec/polymorphism-custom-names.spec.ts | 5 +---- spec/polymorphism-custom-type-hints.spec.ts | 7 ++----- spec/polymorphism.spec.ts | 3 +-- spec/set.spec.ts | 4 ---- spec/utils/everything.ts | 2 -- src/typedjson/json-object.ts | 1 + 8 files changed, 5 insertions(+), 25 deletions(-) diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 5e60762..7b1d878 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -10,8 +10,6 @@ describe('array of objects', () => { @jsonMember numProp: number; - constructor(init: {strProp: string; numProp: number}) - constructor() constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; @@ -87,8 +85,6 @@ describe('multidimensional arrays', () => { @jsonArrayMember(WithArrays, {dimensions: 2}) arrayWithArray?: Array>; - constructor(init: IWithArrays) - constructor() constructor(init?: IWithArrays) { if (init) { Object.assign(this, init); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index dad96b5..8b9a36b 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -13,8 +13,6 @@ describe('map dictionary shape', () => { @jsonMember numProp: number; - constructor(init: { strProp: string; numProp: number }) - constructor() constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; @@ -85,8 +83,6 @@ describe('map of array dictionary shape', () => { @jsonMember numProp: number; - constructor(init: { strProp: string; numProp: number }) - constructor() constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index ecd83f0..206990f 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -10,8 +10,6 @@ describe('polymorphic custom names', () => { @jsonMember({name: 'last-name'}) lastName: string; - constructor(); - constructor(firstName: string, lastName: string); constructor(firstName?: string, lastName?: string) { if (firstName && lastName) { this.firstName = firstName; @@ -53,8 +51,7 @@ describe('polymorphic custom names', () => { investAmount: number; constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName: string, lastName: string, investAmount?: number); constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index 15c8758..7790565 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -18,7 +18,6 @@ describe('polymorphism custom type hints', () => { @jsonMember lastName: string; - constructor(); constructor(firstName?: string, lastName?: string); constructor(firstName: string, lastName: string); constructor(firstName?: string, lastName?: string) { @@ -35,8 +34,7 @@ describe('polymorphism custom type hints', () => { salary: number; constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, salary: number); + constructor(firstName: string, lastName: string, salary?: number); constructor(firstName?: string, lastName?: string, salary?: number) { super(firstName, lastName); @@ -58,8 +56,7 @@ describe('polymorphism custom type hints', () => { investAmount: number; constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName: string, lastName: string, investAmount?: number); constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index f3c7c11..9e8ff05 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -53,8 +53,7 @@ describe('polymorphism', () => { investAmount: number; constructor(); - constructor(firstName: string, lastName: string); - constructor(firstName: string, lastName: string, investAmount: number); + constructor(firstName: string, lastName: string, investAmount?: number); constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); diff --git a/spec/set.spec.ts b/spec/set.spec.ts index 40bb327..c7d4365 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -10,8 +10,6 @@ describe('set of objects', () => { @jsonMember numProp: number; - constructor(init: { strProp: string; numProp: number }) - constructor() constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; @@ -107,8 +105,6 @@ describe('set array member', () => { @jsonMember numProp: number; - constructor(init: { strProp: string; numProp: number }) - constructor() constructor(init?: { strProp: string; numProp: number }) { if (init) { this.strProp = init.strProp; diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index 84c7653..f09c52b 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -124,8 +124,6 @@ export class Everything implements IEverything { // @jsonMember // [symbolProp]: string; - constructor(); - constructor(init: IEverything); constructor(init?: IEverything) { if (init) { Object.assign(this, init); diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index ab2407e..7fb31e3 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -73,6 +73,7 @@ export function jsonObject( * Marks that a class is serializable using TypedJSON, with additional settings. * @param options Configuration settings. */ +// eslint-disable-next-line @typescript-eslint/unified-signatures export function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void; /** From b20ca2b11dc176c297cdb5ff801cdaa504657298 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 13:46:56 +0000 Subject: [PATCH 017/119] Deal with useless constructor linter error --- src/typedjson/type-descriptor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts index edbf251..48eafc3 100644 --- a/src/typedjson/type-descriptor.ts +++ b/src/typedjson/type-descriptor.ts @@ -9,6 +9,7 @@ export abstract class TypeDescriptor { export type Typelike = TypeDescriptor | Function; export class ConcreteTypeDescriptor extends TypeDescriptor { + // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor(ctor: Function) { super(ctor); } From 3fedb1262be4903f550bcca690c403a08234e1ba Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 13:55:18 +0000 Subject: [PATCH 018/119] Fix member ordering --- spec/beforeSerialization.spec.ts | 8 +-- spec/onDeserialized.spec.ts | 8 +-- spec/utils/everything.ts | 61 +++++++++++----------- src/parser.ts | 80 ++++++++++++++--------------- src/typedjson/deserializer.ts | 8 +-- src/typedjson/metadata.ts | 87 ++++++++++++++++---------------- 6 files changed, 125 insertions(+), 127 deletions(-) diff --git a/spec/beforeSerialization.spec.ts b/spec/beforeSerialization.spec.ts index 8046e21..fe6c2fa 100644 --- a/spec/beforeSerialization.spec.ts +++ b/spec/beforeSerialization.spec.ts @@ -76,13 +76,13 @@ describe('beforeSerialization', () => { spyOn(this, 'beforeSerial'); } - beforeSerial() { - // should call - } - static beforeSerial() { // should NOT call } + + beforeSerial() { + // should call + } } spyOn(Person, 'beforeSerial'); diff --git a/spec/onDeserialized.spec.ts b/spec/onDeserialized.spec.ts index cfb308c..f9bf194 100644 --- a/spec/onDeserialized.spec.ts +++ b/spec/onDeserialized.spec.ts @@ -69,14 +69,14 @@ describe('onDeserialized', () => { @jsonMember age: number; - static afterDeser() { - // should NOT call - } - constructor() { spyOn(this, 'afterDeser'); } + static afterDeser() { + // should NOT call + } + afterDeser() { // should call } diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index f09c52b..2d54a1d 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -64,43 +64,17 @@ export interface IEverything { @jsonObject export class Everything implements IEverything { - static create(): IEverything { - return { - strProp: 'string', - numProp: 123, - boolProp: true, - dateProp: new Date(1543912019), - // nullable: null, - undefinable: undefined, - enum: JustEnum.Four, - constEnum: ConstEnum.Four, - strEnum: StrEnum.Four, - constStrEnum: ConstStrEnum.Four, - // heteroEnum: HeteroEnum.Two, - // heteroEnum2: HeteroEnum.Four, - // constHeteroEnum: ConstHeteroEnum.Two, - // constHeteroEnum2: ConstHeteroEnum.Four, - // [symbolProp]: 'symbol string', - }; - } - - static expected(): Everything { - const obj = Everything.create(); - // properties that are undefined are not serialized - delete obj.undefinable; - return new Everything(obj); - } - @jsonMember strProp: string; + @jsonMember numProp: number; + @jsonMember boolProp: boolean; @jsonMember dateProp: Date; // @jsonMember - // nullable: {}|null; @jsonMember optional?: {}; @jsonMember @@ -122,14 +96,41 @@ export class Everything implements IEverything { // @jsonMember // constHeteroEnum2: ConstHeteroEnum; // @jsonMember - // [symbolProp]: string; - constructor(init?: IEverything) { if (init) { Object.assign(this, init); } } + // [symbolProp]: string; + static create(): IEverything { + return { + strProp: 'string', + numProp: 123, + boolProp: true, + dateProp: new Date(1543912019), + // nullable: null, + undefinable: undefined, + enum: JustEnum.Four, + constEnum: ConstEnum.Four, + strEnum: StrEnum.Four, + constStrEnum: ConstStrEnum.Four, + // heteroEnum: HeteroEnum.Two, + // heteroEnum2: HeteroEnum.Four, + // constHeteroEnum: ConstHeteroEnum.Two, + // constHeteroEnum2: ConstHeteroEnum.Four, + // [symbolProp]: 'symbol string', + }; + } + + // nullable: {}|null; + static expected(): Everything { + const obj = Everything.create(); + // properties that are undefined are not serialized + delete obj.undefinable; + return new Everything(obj); + } + foo() { return 'Just to be sure'; } diff --git a/src/parser.ts b/src/parser.ts index 6576ccc..ecbe3b6 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -48,7 +48,45 @@ export interface ITypedJSONSettings extends OptionsBase { } export class TypedJSON { - // #region Static + + private static _globalConfig: ITypedJSONSettings; + + private serializer: Serializer = new Serializer(); + private deserializer: Deserializer = new Deserializer(); + private globalKnownTypes: Array> = []; + private indent: number = 0; + private rootConstructor: Serializable; + private errorHandler: (e: Error) => void; + private nameResolver: (ctor: Function) => string; + private replacer?: (key: string, value: any) => any; + + /** + * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object + * instances of the specified root class type. + * @param rootConstructor The constructor of the root class type. + * @param settings Additional configuration settings. + */ + constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { + const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); + + if (!rootMetadata + || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { + throw new TypeError( + 'The TypedJSON root data type must have the @jsonObject decorator used.', + ); + } + + this.nameResolver = (ctor) => nameof(ctor); + this.rootConstructor = rootConstructor; + this.errorHandler = (error) => logError(error); + + if (settings) { + this.config(settings); + } else if (TypedJSON._globalConfig) { + this.config({}); + } + } + static parse( object: any, rootType: Serializable, @@ -251,8 +289,6 @@ export class TypedJSON { return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); } - private static _globalConfig: ITypedJSONSettings; - static setGlobalConfig(config: ITypedJSONSettings) { if (this._globalConfig) { Object.assign(this._globalConfig, config); @@ -261,44 +297,6 @@ export class TypedJSON { } } - // #endregion - - private serializer: Serializer = new Serializer(); - private deserializer: Deserializer = new Deserializer(); - private globalKnownTypes: Array> = []; - private indent: number = 0; - private rootConstructor: Serializable; - private errorHandler: (e: Error) => void; - private nameResolver: (ctor: Function) => string; - private replacer?: (key: string, value: any) => any; - - /** - * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object - * instances of the specified root class type. - * @param rootConstructor The constructor of the root class type. - * @param settings Additional configuration settings. - */ - constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { - const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); - - if (!rootMetadata - || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { - throw new TypeError( - 'The TypedJSON root data type must have the @jsonObject decorator used.', - ); - } - - this.nameResolver = (ctor) => nameof(ctor); - this.rootConstructor = rootConstructor; - this.errorHandler = (error) => logError(error); - - if (settings) { - this.config(settings); - } else if (TypedJSON._globalConfig) { - this.config({}); - } - } - /** * Configures TypedJSON through a settings object. * @param settings The configuration settings object. diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index fa7f5c5..de3d271 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -164,14 +164,14 @@ export class Deserializer { return map; } + retrievePreserveNull(memberOptions?: OptionsBase): boolean { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + } + private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { return (expectedShape === MapShape.ARRAY && Array.isArray(source)) || (expectedShape === MapShape.OBJECT && typeof source === 'object'); } - - retrievePreserveNull(memberOptions?: OptionsBase): boolean { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - } } function throwTypeMismatchError( diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index be9dfaf..ab480b7 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -43,7 +43,48 @@ export interface JsonMemberMetadata { } export class JsonObjectMetadata { - // #region Static + + dataMembers = new Map(); + + /** Set of known types used for polymorphic deserialization */ + knownTypes = new Set>(); + + /** If present override the global function */ + typeHintEmitter?: TypeHintEmitter; + /** If present override the global function */ + typeResolver?: TypeResolver; + /** Gets or sets the constructor function for the jsonObject. */ + classType: Function; + + /** + * Indicates whether this class was explicitly annotated with @jsonObject + * or implicitly by @jsonMember + */ + isExplicitlyMarked: boolean = false; + + /** + * Indicates whether this type is handled without annotation. This is usually + * used for the builtin types (except for Maps, Sets, and normal Arrays). + */ + isHandledWithoutAnnotation: boolean = false; + + /** Name used to encode polymorphic type */ + name?: string; + + options?: OptionsBase; + + onDeserializedMethodName?: string; + + beforeSerializationMethodName?: string; + + initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; + + constructor( + classType: Function, + ) { + this.classType = classType; + } + /** * Gets the name of a class as it appears in a serialized JSON string. * @param ctor The constructor of a class (with or without jsonObject). @@ -87,7 +128,7 @@ export class JsonObjectMetadata { if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { return prototype[METADATA_FIELD_KEY]; } - // Target has no JsonObjectMetadata associated with it yet, create it now. + // Target has no JsonObjectMetadata associated with it yet, create it now. const objectMetadata = new JsonObjectMetadata(prototype.constructor); // Inherit json members and known types from parent @jsonObject (if any). @@ -125,48 +166,6 @@ export class JsonObjectMetadata { return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) || ctor === DataView || ctor === ArrayBuffer; } - // #endregion - - constructor( - classType: Function, - ) { - this.classType = classType; - } - - dataMembers = new Map(); - - /** Set of known types used for polymorphic deserialization */ - knownTypes = new Set>(); - /** If present override the global function */ - typeHintEmitter?: TypeHintEmitter; - /** If present override the global function */ - typeResolver?: TypeResolver; - - /** Gets or sets the constructor function for the jsonObject. */ - classType: Function; - - /** - * Indicates whether this class was explicitly annotated with @jsonObject - * or implicitly by @jsonMember - */ - isExplicitlyMarked: boolean = false; - - /** - * Indicates whether this type is handled without annotation. This is usually - * used for the builtin types (except for Maps, Sets, and normal Arrays). - */ - isHandledWithoutAnnotation: boolean = false; - - /** Name used to encode polymorphic type */ - name?: string; - - options?: OptionsBase; - - onDeserializedMethodName?: string; - - beforeSerializationMethodName?: string; - - initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; } export function injectMetadataInformation( From 980f19f678e8ab26d89454ebbae1d629373f0db7 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 14:04:08 +0000 Subject: [PATCH 019/119] Format pass --- spec/base.spec.ts | 1 + spec/helpers/matchers.ts | 2 ++ spec/just-json.spec.ts | 5 +++-- spec/map.spec.ts | 4 ++-- spec/onDeserialized.spec.ts | 2 ++ spec/parse-to-object.spec.ts | 8 ++++---- spec/set.spec.ts | 8 ++++---- src/parser.ts | 34 ++++++++++++++++---------------- src/typedjson/deserializer.ts | 4 ++-- src/typedjson/helpers.ts | 6 +++--- src/typedjson/json-member.ts | 2 +- src/typedjson/options-base.ts | 4 ++-- src/typedjson/serializer.ts | 10 +++++----- src/typedjson/type-descriptor.ts | 3 ++- src/typedjson/types.ts | 2 +- 15 files changed, 51 insertions(+), 44 deletions(-) diff --git a/spec/base.spec.ts b/spec/base.spec.ts index ab503a4..b99c5ec 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -199,6 +199,7 @@ describe('basic serialization of', () => { get prop(): string { return this._prop; } + set prop(val: string) { this._prop = val; } diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index b9ef5f0..7ee3fd9 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -121,8 +121,10 @@ declare namespace jasmine { expectation: Partial | Array, ...expectationFailOutput: Array, ): boolean; + toBeInstanceOf(expectation: Function, ...expectationFailOutput: Array): boolean; } + interface ArrayLikeMatchers extends Matchers> { toBeOfLength: (expectation: number, ...expectationFailOutput: Array) => boolean; } diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index a81d384..d7ffb5c 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -12,7 +12,8 @@ describe('json (without automatic stringify)', () => { try { expect(TypedJSON.parse('"sdfs"fdsf"', String)).toEqual(undefined); fail(); - } catch (e) {} + } catch (e) { + } }); it('should serialize', () => { @@ -94,7 +95,7 @@ describe('json (without automatic stringify)', () => { }); it('should serialize', () => { - expect(TypedJSON.toPlainArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); + expect(TypedJSON.toPlainArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); }); }); }); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index 8b9a36b..3b2a394 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -13,7 +13,7 @@ describe('map dictionary shape', () => { @jsonMember numProp: number; - constructor(init?: { strProp: string; numProp: number }) { + constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; @@ -83,7 +83,7 @@ describe('map of array dictionary shape', () => { @jsonMember numProp: number; - constructor(init?: { strProp: string; numProp: number }) { + constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; diff --git a/spec/onDeserialized.spec.ts b/spec/onDeserialized.spec.ts index f9bf194..118103f 100644 --- a/spec/onDeserialized.spec.ts +++ b/spec/onDeserialized.spec.ts @@ -20,6 +20,7 @@ describe('onDeserialized', () => { return `${this.name} is ${this.age}y old`; } } + spyOn(Person, 'afterDeser'); const person = TypedJSON.parse({name: 'John', age: 20}, Person)!; @@ -85,6 +86,7 @@ describe('onDeserialized', () => { return `${this.name} is ${this.age}y old`; } } + spyOn(Person, 'afterDeser'); const person = TypedJSON.parse({name: 'John', age: 20}, Person)!; diff --git a/spec/parse-to-object.spec.ts b/spec/parse-to-object.spec.ts index bf9d47b..83df746 100644 --- a/spec/parse-to-object.spec.ts +++ b/spec/parse-to-object.spec.ts @@ -51,9 +51,9 @@ describe('parse To Object', () => { }); it('should passthrough builtins', () => { - const date = new Date(); - expect(parseToJSObject(date, Date)).toBe(date); - const buffer = new ArrayBuffer(3); - expect(parseToJSObject(buffer, ArrayBuffer)).toBe(buffer); + const date = new Date(); + expect(parseToJSObject(date, Date)).toBe(date); + const buffer = new ArrayBuffer(3); + expect(parseToJSObject(buffer, ArrayBuffer)).toBe(buffer); }); }); diff --git a/spec/set.spec.ts b/spec/set.spec.ts index c7d4365..e066b28 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -10,7 +10,7 @@ describe('set of objects', () => { @jsonMember numProp: number; - constructor(init?: { strProp: string; numProp: number }) { + constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; @@ -105,7 +105,7 @@ describe('set array member', () => { @jsonMember numProp: number; - constructor(init?: { strProp: string; numProp: number }) { + constructor(init?: {strProp: string; numProp: number}) { if (init) { this.strProp = init.strProp; this.numProp = init.numProp; @@ -180,8 +180,8 @@ describe('set array member', () => { prop: [ [ { - strProp: 'delta', - numProp: 4, + strProp: 'delta', + numProp: 4, }, ], [ diff --git a/src/parser.ts b/src/parser.ts index ecbe3b6..e3313ff 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -99,31 +99,31 @@ export class TypedJSON { object: any, elementType: Serializable, settings?: ITypedJSONSettings, - dimensions?: 1 + dimensions?: 1, ): Array; static parseAsArray( object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, - dimensions: 2 + dimensions: 2, ): Array>; static parseAsArray( object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, - dimensions: 3 + dimensions: 3, ): Array>>; static parseAsArray( object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, - dimensions: 4 + dimensions: 4, ): Array>>>; static parseAsArray( object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, - dimensions: 5 + dimensions: 5, ): Array>>>>; static parseAsArray( object: any, @@ -216,7 +216,7 @@ export class TypedJSON { keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings, - ): IndexedObject | Array<{ key: any; value: any }> | undefined { + ): IndexedObject | Array<{key: any; value: any}> | undefined { return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); } @@ -327,17 +327,17 @@ export class TypedJSON { } if (settings.replacer) { -this.replacer = settings.replacer; -} + this.replacer = settings.replacer; + } if (settings.typeResolver) { -this.deserializer.setTypeResolver(settings.typeResolver); -} + this.deserializer.setTypeResolver(settings.typeResolver); + } if (settings.typeHintEmitter) { -this.serializer.setTypeHintEmitter(settings.typeHintEmitter); -} + this.serializer.setTypeHintEmitter(settings.typeHintEmitter); + } if (settings.indent) { -this.indent = settings.indent; -} + this.indent = settings.indent; + } if (settings.nameResolver) { this.nameResolver = settings.nameResolver; @@ -406,7 +406,7 @@ this.indent = settings.indent; parseAsArray(object: any, dimensions: number = 1): Array { const json = parseToJSObject(object, Array); return this.deserializer.convertSingleValue( -json, + json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes), ); @@ -415,7 +415,7 @@ json, parseAsSet(object: any): Set { const json = parseToJSObject(object, Set); return this.deserializer.convertSingleValue( -json, + json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes), ); @@ -479,7 +479,7 @@ json, toPlainMap( object: Map, keyConstructor: Serializable, - ): IndexedObject | Array<{ key: any; value: any }> | undefined { + ): IndexedObject | Array<{key: any; value: any}> | undefined { try { return this.serializer.convertSingleValue( object, diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index de3d271..970828a 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -123,7 +123,7 @@ export class Deserializer { } this.errorHandler(new TypeError( `Could not deserialize '${memberName}': don't know how to deserialize this type'.`, -)); + )); } instantiateType(ctor: any) { @@ -170,7 +170,7 @@ export class Deserializer { private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { return (expectedShape === MapShape.ARRAY && Array.isArray(source)) - || (expectedShape === MapShape.OBJECT && typeof source === 'object'); + || (expectedShape === MapShape.OBJECT && typeof source === 'object'); } } diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index b0d0401..5dbf69d 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -55,8 +55,8 @@ function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean } export function parseToJSObject(json: any, expectedType: Serializable): Object { - if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { - return json; + if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { + return json; } return JSON.parse(json); } @@ -121,7 +121,7 @@ export const isReflectMetadataSupported = * Gets the name of a function. * @param fn The function whose name to get. */ -export function nameof(fn: Function & { name?: string }) { +export function nameof(fn: Function & {name?: string}) { if (typeof fn.name === 'string') { return fn.name; } diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index 42b6325..5697e02 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -91,7 +91,7 @@ export function jsonMember( if (!reflectPropCtor) { logError( `${decoratorName}: could not resolve detected property constructor at runtime.${ - MISSING_REFLECT_CONF_MSG}`, + MISSING_REFLECT_CONF_MSG}`, ); return; } diff --git a/src/typedjson/options-base.ts b/src/typedjson/options-base.ts index 8a379da..cd1815b 100644 --- a/src/typedjson/options-base.ts +++ b/src/typedjson/options-base.ts @@ -42,8 +42,8 @@ export function getOptionValue( options?: OptionsBase, ): Required[K] { if (options && options[key] != null) { -return options[key]!; -} + return options[key]!; + } return getDefaultOptionOf(key); } diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index edd80a8..d5706a4 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -132,11 +132,11 @@ export class Serializer { memberOptions?: OptionsBase, ): any { if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { -return null; -} + return null; + } if (!isValueDefined(sourceObject)) { -return; -} + return; + } if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { const expectedName = nameof(typeDescriptor.ctor); @@ -377,7 +377,7 @@ function convertAsMap( memberName: string, serializer: Serializer, memberOptions?: OptionsBase, -): IndexedObject | Array<{ key: any; value: any }> { +): IndexedObject | Array<{key: any; value: any}> { if (!(typeDescriptor instanceof MapTypeDescriptor)) { throw new TypeError( `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please` diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts index 48eafc3..b560697 100644 --- a/src/typedjson/type-descriptor.ts +++ b/src/typedjson/type-descriptor.ts @@ -1,5 +1,6 @@ export abstract class TypeDescriptor { - protected constructor(readonly ctor: Function) {} + protected constructor(readonly ctor: Function) { + } getTypes(): Array { return [this.ctor]; diff --git a/src/typedjson/types.ts b/src/typedjson/types.ts index a6d97e9..5913901 100644 --- a/src/typedjson/types.ts +++ b/src/typedjson/types.ts @@ -1,4 +1,4 @@ -export type IndexedObject = Object & { [key: string]: any }; +export type IndexedObject = Object & {[key: string]: any}; export interface AbstractType extends Function { prototype: T; From 41167614b99c0a66378cff94c064c6654bd46aa2 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 16:11:19 +0000 Subject: [PATCH 020/119] Fix strict boolean expressions --- js/parser.d.ts | 32 +-- js/typedjson.js | 238 +++++++++++--------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 +- js/typedjson.min.js.map | 2 +- js/typedjson/deserializer.d.ts | 2 +- js/typedjson/metadata.d.ts | 36 +-- spec/array.spec.ts | 4 +- spec/custom-deserializer.spec.ts | 12 +- spec/helpers/matchers.ts | 4 +- spec/map.spec.ts | 4 +- spec/polymorphism-custom-names.spec.ts | 6 +- spec/polymorphism-custom-type-hints.spec.ts | 6 +- spec/polymorphism.spec.ts | 6 +- spec/set.spec.ts | 4 +- spec/utils/everything.ts | 2 +- src/parser.ts | 37 +-- src/typedjson/deserializer.ts | 66 +++--- src/typedjson/json-array-member.ts | 2 +- src/typedjson/json-map-member.ts | 2 +- src/typedjson/json-member.ts | 23 +- src/typedjson/json-object.ts | 12 +- src/typedjson/json-set-member.ts | 2 +- src/typedjson/metadata.ts | 30 +-- src/typedjson/options-base.ts | 4 +- src/typedjson/serializer.ts | 60 ++--- src/typedjson/to-json.ts | 2 +- src/typedjson/type-descriptor.ts | 4 +- 28 files changed, 321 insertions(+), 287 deletions(-) diff --git a/js/parser.d.ts b/js/parser.d.ts index d79cff9..c480ce3 100644 --- a/js/parser.d.ts +++ b/js/parser.d.ts @@ -36,6 +36,22 @@ export interface ITypedJSONSettings extends OptionsBase { knownTypes?: Array>; } export declare class TypedJSON { + private static _globalConfig; + private serializer; + private deserializer; + private globalKnownTypes; + private indent; + private rootConstructor; + private errorHandler; + private nameResolver; + private replacer?; + /** + * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object + * instances of the specified root class type. + * @param rootConstructor The constructor of the root class type. + * @param settings Additional configuration settings. + */ + constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings); static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined; static parseAsArray(object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1): Array; static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 2): Array>; @@ -65,23 +81,7 @@ export declare class TypedJSON { static stringifyAsArray(object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): string; static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string; static stringifyAsMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): string; - private static _globalConfig; static setGlobalConfig(config: ITypedJSONSettings): void; - private serializer; - private deserializer; - private globalKnownTypes; - private indent; - private rootConstructor; - private errorHandler; - private nameResolver; - private replacer?; - /** - * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object - * instances of the specified root class type. - * @param rootConstructor The constructor of the root class type. - * @param settings Additional configuration settings. - */ - constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings); /** * Configures TypedJSON through a settings object. * @param settings The configuration settings object. diff --git a/js/typedjson.js b/js/typedjson.js index 086f6a3..2329d34 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-26 +// [typedjson] Version: 1.6.0-rc2 - 2020-08-27 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -240,7 +240,6 @@ function identity(arg) { var METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; var metadata_JsonObjectMetadata = /** @class */ (function () { - // #endregion function JsonObjectMetadata(classType) { this.dataMembers = new Map(); /** Set of known types used for polymorphic deserialization */ @@ -257,14 +256,13 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { this.isHandledWithoutAnnotation = false; this.classType = classType; } - // #region Static /** * Gets the name of a class as it appears in a serialized JSON string. * @param ctor The constructor of a class (with or without jsonObject). */ JsonObjectMetadata.getJsonObjectName = function (ctor) { var metadata = JsonObjectMetadata.getFromConstructor(ctor); - return metadata ? nameof(metadata.classType) : nameof(ctor); + return metadata === undefined ? nameof(ctor) : nameof(metadata.classType); }; /** * Gets jsonObject metadata information from a class. @@ -272,7 +270,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { */ JsonObjectMetadata.getFromConstructor = function (ctor) { var prototype = ctor.prototype; - if (!prototype) { + if (prototype == null) { return; } var metadata; @@ -281,7 +279,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { metadata = prototype[METADATA_FIELD_KEY]; } // Ignore implicitly added jsonObject (through jsonMember) - if (metadata && metadata.isExplicitlyMarked) { + if ((metadata === null || metadata === void 0 ? void 0 : metadata.isExplicitlyMarked) === true) { return metadata; } // In the end maybe it is something which we can handle directly @@ -300,7 +298,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { var objectMetadata = new JsonObjectMetadata(prototype.constructor); // Inherit json members and known types from parent @jsonObject (if any). var parentMetadata = prototype[METADATA_FIELD_KEY]; - if (parentMetadata) { + if (parentMetadata !== undefined) { parentMetadata.dataMembers.forEach(function (memberMetadata, propKey) { objectMetadata.dataMembers.set(propKey, memberMetadata); }); @@ -324,7 +322,7 @@ var metadata_JsonObjectMetadata = /** @class */ (function () { */ JsonObjectMetadata.getKnownTypeNameFromType = function (constructor) { var metadata = JsonObjectMetadata.getFromConstructor(constructor); - return metadata ? nameof(metadata.classType) : nameof(constructor); + return metadata === undefined ? nameof(constructor) : nameof(metadata.classType); }; JsonObjectMetadata.doesHandleWithoutAnnotation = function (ctor) { return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) @@ -347,12 +345,14 @@ function injectMetadataInformation(prototype, propKey, metadata) { return; } // Methods cannot be serialized. - // @ts-ignore symbol indexing is not supported by ts + // symbol indexing is not supported by ts if (typeof prototype[propKey] === 'function') { logError(decoratorName + ": cannot use a method property."); return; } - if (!metadata || (!metadata.type && !metadata.deserializer)) { + // @todo check if metadata is ever undefined, if so, change parameter type + if (metadata === undefined + || (metadata.type === undefined && metadata.deserializer === undefined)) { logError(decoratorName + ": JsonMemberMetadata has unknown type."); return; } @@ -360,8 +360,8 @@ function injectMetadataInformation(prototype, propKey, metadata) { // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked // with '@jsonObject' as well. var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); - if (!metadata.deserializer) { - // @ts-ignore above is a check (!deser && !ctor) + if (metadata.deserializer === undefined) { + // If deserializer is not present then type must be metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); } // clear metadata of undefined properties to save memory @@ -403,13 +403,13 @@ function getDefaultOptionOf(key) { return null; } function getOptionValue(key, options) { - if (options && options[key] != null) { + if ((options === null || options === void 0 ? void 0 : options[key]) !== undefined) { return options[key]; } return getDefaultOptionOf(key); } function mergeOptions(existing, moreSpecific) { - return !moreSpecific + return moreSpecific === undefined ? existing : __assign(__assign({}, existing), moreSpecific); } @@ -440,6 +440,7 @@ var TypeDescriptor = /** @class */ (function () { var ConcreteTypeDescriptor = /** @class */ (function (_super) { __extends(ConcreteTypeDescriptor, _super); + // eslint-disable-next-line @typescript-eslint/no-useless-constructor function ConcreteTypeDescriptor(ctor) { return _super.call(this, ctor) || this; } @@ -499,9 +500,9 @@ var MapTypeDescriptor = /** @class */ (function (_super) { return _super.prototype.getTypes.call(this).concat(this.keyType.getTypes(), this.valueType.getTypes()); }; MapTypeDescriptor.prototype.getCompleteOptions = function () { - var _a; + var _a, _b; return { - shape: ((_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) ? this.options.shape : 0 /* ARRAY */, + shape: (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) !== null && _b !== void 0 ? _b : 0 /* ARRAY */, }; }; return MapTypeDescriptor; @@ -525,7 +526,7 @@ function MapT(keyType, valueType, options) { // return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); // } function isTypelike(type) { - return type && (typeof type === 'function' || type instanceof TypeDescriptor); + return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); } function ensureTypeDescriptor(type) { return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); @@ -537,7 +538,7 @@ function ensureTypeDescriptor(type) { function defaultTypeResolver(sourceObject, knownTypes) { - if (sourceObject.__type) { + if (sourceObject.__type != null) { return knownTypes.get(sourceObject.__type); } } @@ -599,7 +600,7 @@ var deserializer_Deserializer = /** @class */ (function () { return; } var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer) { + if (deserializer !== undefined) { return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); } if (typeof sourceObject === 'object') { @@ -619,11 +620,11 @@ var deserializer_Deserializer = /** @class */ (function () { var result = new Map(); knownTypeMaps.forEach(function (knownTypes) { knownTypes.forEach(function (ctor, name) { - if (_this.nameResolver) { - result.set(_this.nameResolver(ctor), ctor); + if (_this.nameResolver === undefined) { + result.set(name, ctor); } else { - result.set(name, ctor); + result.set(_this.nameResolver(ctor), ctor); } }); }); @@ -633,26 +634,24 @@ var deserializer_Deserializer = /** @class */ (function () { var _this = this; var map = new Map(); knowTypes.forEach(function (ctor) { - if (_this.nameResolver) { - map.set(_this.nameResolver(ctor), ctor); + if (_this.nameResolver === undefined) { + var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); + var name_1 = (knownTypeMeta === null || knownTypeMeta === void 0 ? void 0 : knownTypeMeta.isExplicitlyMarked) === true ? knownTypeMeta.name : null; + map.set(name_1 !== null && name_1 !== void 0 ? name_1 : ctor.name, ctor); } else { - var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); - var name_1 = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name - ? knownTypeMeta.name - : ctor.name; - map.set(name_1, ctor); + map.set(_this.nameResolver(ctor), ctor); } }); return map; }; + Deserializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + }; Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); }; - Deserializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; return Deserializer; }()); @@ -669,7 +668,7 @@ function makeTypeErrorMessage(expectedType, actualType, memberName) { + (" got '" + actualTypeName + "'."); } function srcTypeNameForDebug(sourceObject) { - return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; + return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor); } function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { if (sourceObject.constructor !== typeDescriptor.ctor) { @@ -686,28 +685,28 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); var knownTypeConstructors = knownTypes; var typeResolver = deserializer.getTypeResolver(); - if (sourceObjectMetadata) { + if (sourceObjectMetadata !== undefined) { // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); - if (sourceObjectMetadata.typeResolver) { + if (sourceObjectMetadata.typeResolver !== undefined) { typeResolver = sourceObjectMetadata.typeResolver; } } // Check if a type-hint is available from the source object. var typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint) { + if (typeFromTypeHint != null) { // Check if type hint is a valid subtype of the expected source type. if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { // Hell yes. expectedSelfType = typeFromTypeHint; sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata) { + if (sourceObjectMetadata !== undefined) { // Also merge new known types from subtype. knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); } } } - if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) { + if ((sourceObjectMetadata === null || sourceObjectMetadata === void 0 ? void 0 : sourceObjectMetadata.isExplicitlyMarked) === true) { var sourceMetadata_1 = sourceObjectMetadata; // Strong-typed deserialization available, get to it. // First deserialize properties into a temporary object. @@ -719,21 +718,23 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); var revivedValue; - if (objMemberMetadata.deserializer) { + if (objMemberMetadata.deserializer !== undefined) { revivedValue = objMemberMetadata.deserializer(objMemberValue); } - else if (objMemberMetadata.type) { - revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); - } - else { + else if (objMemberMetadata.type === undefined) { throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" + " no constructor nor deserialization function to use."); } + else { + revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); + } + // @todo revivedValue will never be null in RHS of || if (isValueDefined(revivedValue) - || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)) { + || (deserializer.retrievePreserveNull(objMemberOptions) + && revivedValue === null)) { sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; } - else if (objMemberMetadata.isRequired) { + else if (objMemberMetadata.isRequired === true) { deserializer.getErrorHandler()(new TypeError("Missing required member '" + objMemberDebugName + "'.")); } }); @@ -743,7 +744,7 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d try { targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); // Check the validity of user-defined initializer callback. - if (!targetObject) { + if (targetObject === undefined) { throw new TypeError("Cannot deserialize " + memberName + ":" + " 'initializer' function returned undefined/null" + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); @@ -768,7 +769,7 @@ function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, d Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); // Call onDeserialized method (if any). var methodName = sourceObjectMetadata.onDeserializedMethodName; - if (methodName) { + if (methodName !== undefined) { if (typeof targetObject[methodName] === 'function') { // check for member first targetObject[methodName](); @@ -802,7 +803,7 @@ function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, de deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return []; } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType == null) { deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of" + " Array elements.")); return []; @@ -831,7 +832,7 @@ function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, dese deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); return new Set(); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType == null) { deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of" + " Set elements.")); return new Set(); @@ -864,11 +865,11 @@ function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, dese deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); return new Map(); } - if (!typeDescriptor.keyType) { + if (typeDescriptor.keyType == null) { deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); return new Map(); } - if (!typeDescriptor.valueType) { + if (typeDescriptor.valueType == null) { deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); return new Map(); } @@ -970,6 +971,7 @@ function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName function jsonArrayMember(elementConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { + var _a; var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(elementConstructor)) { logError(decoratorName + ": could not resolve constructor of array elements at runtime."); @@ -993,7 +995,7 @@ function jsonArrayMember(elementConstructor, options) { isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); @@ -1024,14 +1026,13 @@ var serializer_assign = (undefined && undefined.__assign) || function () { function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { + var _a; // 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 will know what to deserialize into (given // the required known-types are defined, and the object is a valid subtype of the expected // type). if (sourceObject.constructor !== expectedSourceType) { - targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name - ? sourceTypeMetadata.name - : nameof(sourceObject.constructor); + targetObject.__type = (_a = sourceTypeMetadata === null || sourceTypeMetadata === void 0 ? void 0 : sourceTypeMetadata.name) !== null && _a !== void 0 ? _a : nameof(sourceObject.constructor); } } /** @@ -1112,7 +1113,7 @@ var serializer_Serializer = /** @class */ (function () { return; } var serializer = this.serializationStrategy.get(typeDescriptor.ctor); - if (serializer) { + if (serializer !== undefined) { return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); } // if not present in the strategy do property by property serialization @@ -1141,9 +1142,16 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se else { sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } - if (sourceTypeMetadata) { + if (sourceTypeMetadata === undefined) { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = serializer_assign({}, sourceObject); + } + else { var beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; - if (beforeSerializationMethodName) { + if (beforeSerializationMethodName !== undefined) { if (typeof sourceObject[beforeSerializationMethodName] === 'function') { // check for member first sourceObject[beforeSerializationMethodName](); @@ -1167,35 +1175,30 @@ function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, se // finally. targetObject = {}; var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); - if (sourceMeta_1.typeHintEmitter) { + if (sourceMeta_1.typeHintEmitter !== undefined) { typeHintEmitter = sourceMeta_1.typeHintEmitter; } sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); var serialized; - if (objMemberMetadata.serializer) { + if (objMemberMetadata.serializer !== undefined) { serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); } - else if (objMemberMetadata.type) { - serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); - } - else { + else if (objMemberMetadata.type === undefined) { throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" + " no constructor nor serialization function to use."); } + else { + serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + } if (isValueDefined(serialized) + // @todo check whether the or condition ever applies + // eslint-disable-next-line @typescript-eslint/tslint/config || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)) { targetObject[objMemberMetadata.name] = serialized; } }); } - else { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = serializer_assign({}, sourceObject); - } // Add type-hint. typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); return targetObject; @@ -1210,7 +1213,7 @@ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, ser throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please" + ' use proper annotation or function for this type'); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType == null) { throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); } // Check the type of each element, individually. @@ -1222,11 +1225,14 @@ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, ser if (!(serializer.retrievePreserveNull(memberOptions) && element === null) && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { var expectedTypeName = nameof(typeDescriptor.elementType.ctor); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions var actualTypeName = element && nameof(element.constructor); throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); } }); + // @todo, is this necessary? + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { // Just for debugging purposes. memberName += '[]'; @@ -1245,10 +1251,12 @@ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, seria throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please" + ' use proper annotation or function for this type'); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType == null) { throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); } // For debugging and error tracking. + // @todo, is this necessary? + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { memberName += '[]'; } @@ -1277,12 +1285,13 @@ function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, seria throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please" + ' use proper annotation or function for this type'); } - if (!typeDescriptor.valueType) { + if (typeDescriptor.valueType == null) { // @todo Check type throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); } - if (!typeDescriptor.keyType) { + if (typeDescriptor.keyType == null) { // @todo Check type throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); } + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { memberName += '[]'; } @@ -1299,6 +1308,8 @@ function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, seria // We are not going to emit entries with undefined keys OR undefined values. var keyDefined = isValueDefined(resultKeyValuePairObj.key); var valueDefined = isValueDefined(resultKeyValuePairObj.value) + // @todo check + // eslint-disable-next-line @typescript-eslint/tslint/config || (resultKeyValuePairObj.value === null && preserveNull); if (keyDefined && valueDefined) { if (resultShape === 1 /* OBJECT */) { @@ -1363,27 +1374,25 @@ var parser_TypedJSON = /** @class */ (function () { * @param settings Additional configuration settings. */ function TypedJSON(rootConstructor, settings) { - // #endregion this.serializer = new serializer_Serializer(); this.deserializer = new deserializer_Deserializer(); this.globalKnownTypes = []; this.indent = 0; var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); - if (!rootMetadata + if (rootMetadata === undefined || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); } this.nameResolver = function (ctor) { return nameof(ctor); }; this.rootConstructor = rootConstructor; this.errorHandler = function (error) { return logError(error); }; - if (settings) { + if (settings !== undefined) { this.config(settings); } - else if (TypedJSON._globalConfig) { + else if (TypedJSON._globalConfig !== undefined) { this.config({}); } } - // #region Static TypedJSON.parse = function (object, rootType, settings) { return new TypedJSON(rootType, settings).parse(object); }; @@ -1421,11 +1430,11 @@ var parser_TypedJSON = /** @class */ (function () { return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); }; TypedJSON.setGlobalConfig = function (config) { - if (this._globalConfig) { - Object.assign(this._globalConfig, config); + if (this._globalConfig === undefined) { + this._globalConfig = config; } else { - this._globalConfig = config; + Object.assign(this._globalConfig, config); } }; /** @@ -1433,9 +1442,10 @@ var parser_TypedJSON = /** @class */ (function () { * @param settings The configuration settings object. */ TypedJSON.prototype.config = function (settings) { - if (TypedJSON._globalConfig) { + if (TypedJSON._globalConfig !== undefined) { settings = parser_assign(parser_assign({}, TypedJSON._globalConfig), settings); - if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) { + if (settings.knownTypes !== undefined + && TypedJSON._globalConfig.knownTypes !== undefined) { // Merge known-types (also de-duplicate them, so Array -> Set -> Array). settings.knownTypes = Array.from(new Set(settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes))); } @@ -1443,29 +1453,29 @@ var parser_TypedJSON = /** @class */ (function () { var options = extractOptionBase(settings); this.serializer.options = options; this.deserializer.options = options; - if (settings.errorHandler) { + if (settings.errorHandler !== undefined) { this.errorHandler = settings.errorHandler; this.deserializer.setErrorHandler(settings.errorHandler); this.serializer.setErrorHandler(settings.errorHandler); } - if (settings.replacer) { + if (settings.replacer !== undefined) { this.replacer = settings.replacer; } - if (settings.typeResolver) { + if (settings.typeResolver !== undefined) { this.deserializer.setTypeResolver(settings.typeResolver); } - if (settings.typeHintEmitter) { + if (settings.typeHintEmitter !== undefined) { this.serializer.setTypeHintEmitter(settings.typeHintEmitter); } - if (settings.indent) { + if (settings.indent !== undefined) { this.indent = settings.indent; } - if (settings.nameResolver) { + if (settings.nameResolver !== undefined) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); // this.serializer.set } - if (settings.knownTypes) { + if (settings.knownTypes !== undefined) { // Type-check knownTypes elements to recognize errors in advance. settings.knownTypes.forEach(function (knownType, i) { // tslint:disable-next-line:no-null-keyword @@ -1492,7 +1502,7 @@ var parser_TypedJSON = /** @class */ (function () { this.globalKnownTypes.filter(function (ktc) { return ktc; }).forEach(function (knownTypeCtor) { knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); }); - if (rootMetadata) { + if (rootMetadata !== undefined) { rootMetadata.knownTypes.forEach(function (knownTypeCtor) { knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); }); @@ -1600,7 +1610,7 @@ function jsonObject(optionsOrTarget) { } else { // jsonObject is being used as a decorator factory. - options = optionsOrTarget || {}; + options = optionsOrTarget !== null && optionsOrTarget !== void 0 ? optionsOrTarget : {}; } function decorator(target) { // Create or obtain JsonObjectMetadata object. @@ -1609,22 +1619,22 @@ function jsonObject(optionsOrTarget) { objectMetadata.isExplicitlyMarked = true; objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver) { + if (options.typeResolver !== undefined) { objectMetadata.typeResolver = options.typeResolver; } - if (options.typeHintEmitter) { + if (options.typeHintEmitter !== undefined) { objectMetadata.typeHintEmitter = options.typeHintEmitter; } // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer; - if (options.name) { + if (options.name !== undefined) { objectMetadata.name = options.name; } var optionsBase = extractOptionBase(options); - if (optionsBase) { + if (optionsBase !== undefined) { objectMetadata.options = optionsBase; } - if (options.knownTypes) { + if (options.knownTypes !== undefined) { options.knownTypes .filter(function (knownType) { return Boolean(knownType); }) .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); @@ -1649,7 +1659,10 @@ function isSubClass(target) { function jsonMember(optionsOrPrototype, propKey) { - if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) { + // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string + // The check is not required. + if (propKey !== undefined + && (typeof propKey === 'string' || typeof propKey === 'symbol')) { var prototype = optionsOrPrototype; // For error messages. var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); @@ -1662,9 +1675,8 @@ function jsonMember(optionsOrPrototype, propKey) { return; } var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); - if (!reflectPropCtor) { - logError(decoratorName + ": could not resolve detected property constructor at runtime." - + MISSING_REFLECT_CONF_MSG); + if (reflectPropCtor == null) { + logError(decoratorName + ": could not resolve detected property constructor at runtime." + MISSING_REFLECT_CONF_MSG); return; } var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); @@ -1680,7 +1692,8 @@ function jsonMember(optionsOrPrototype, propKey) { else { // jsonMember used as a decorator factory. return function (target, _propKey) { - var options = optionsOrPrototype || {}; + var _a, _b; + var options = (_a = optionsOrPrototype) !== null && _a !== void 0 ? _a : {}; var typeDescriptor; var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); if (options.hasOwnProperty('constructor')) { @@ -1701,20 +1714,21 @@ function jsonMember(optionsOrPrototype, propKey) { // Use ReflectDecorators to obtain property constructor. if (isReflectMetadataSupported) { var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); - if (!reflectCtor) { + if (reflectCtor == null) { logError(decoratorName + ": cannot resolve detected property constructor at" + " runtime."); return; } typeDescriptor = ensureTypeDescriptor(reflectCtor); } - else if (!options.deserializer) { + else if (options.deserializer === undefined) { logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option" + " is specified."); return; } } - if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) { + if (typeDescriptor !== undefined + && isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, _propKey, { @@ -1723,7 +1737,7 @@ function jsonMember(optionsOrPrototype, propKey) { isRequired: options.isRequired, options: extractOptionBase(options), key: _propKey.toString(), - name: options.name || _propKey.toString(), + name: (_b = options.name) !== null && _b !== void 0 ? _b : _propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); @@ -1764,6 +1778,7 @@ function isSpecialPropertyType(decoratorName, typeDescriptor) { function jsonSetMember(elementConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { + var _a; // For error messages var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(elementConstructor)) { @@ -1783,7 +1798,7 @@ function jsonSetMember(elementConstructor, options) { isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); @@ -1805,6 +1820,7 @@ function jsonSetMember(elementConstructor, options) { function jsonMapMember(keyConstructor, valueConstructor, options) { if (options === void 0) { options = {}; } return function (target, propKey) { + var _a; // For error messages var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); if (!isTypelike(keyConstructor)) { @@ -1828,7 +1844,7 @@ function jsonMapMember(keyConstructor, valueConstructor, options) { isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); @@ -1849,7 +1865,7 @@ function toJson(optionsOrTarget) { }; } function toJsonDecorator(target, options) { - if (!options.overwrite && target.prototype.toJSON) { + if (options.overwrite !== true && target.prototype.toJSON !== undefined) { throw new Error(target.name + " already has toJSON defined!"); } target.prototype.toJSON = function () { diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 50be41a..365180c 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`);\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName\n = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings) {\n this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`\n );\n return;\n }\n\n const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.`\n + MISSING_REFLECT_CONF_MSG,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function;\n\n if (!reflectCtor) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`\n );\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if (isValueDefined(serialized)\n // @todo check whether the or condition ever applies\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n // @todo check\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 10873d6..a934246 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-26 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 2\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 // #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 static getJsonObjectName(ctor: Function): string {\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 static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (!prototype) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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 return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY];\n if (parentMetadata) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype === 'function') {\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 prototype[propKey] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.type && !metadata.deserializer)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (!metadata.deserializer) {\n // @ts-ignore above is a check (!deser && !ctor)\n metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options && options[key] != null) {\nreturn options[key]!;\n}\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return !moreSpecific\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {}\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ? this.options.shape : MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver) {\n result.set(this.nameResolver(ctor), ctor);\n } else {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver) {\n map.set(this.nameResolver(ctor), ctor);\n } else {\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 isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject ? nameof(sourceObject.constructor) : 'undefined';\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type) {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type');\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`);\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (!typeDescriptor.elementType) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type');\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (!typeDescriptor.keyType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (!typeDescriptor.valueType) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName\n = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\nreturn null;\n}\n if (!isValueDefined(sourceObject)) {\nreturn;\n}\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata) {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type) {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n\n if (isValueDefined(serialized)\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n } else {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type');\n }\n if (!typeDescriptor.elementType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{ key: any; value: any }> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (!typeDescriptor.valueType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (!typeDescriptor.keyType) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 // #region Static\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig) {\n Object.assign(this._globalConfig, config);\n } else {\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings) {\n this.config(settings);\n } else if (TypedJSON._globalConfig) {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) {\nthis.replacer = settings.replacer;\n}\n if (settings.typeResolver) {\nthis.deserializer.setTypeResolver(settings.typeResolver);\n}\n if (settings.typeHintEmitter) {\nthis.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n}\n if (settings.indent) {\nthis.indent = settings.indent;\n}\n\n if (settings.nameResolver) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\njson,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\njson,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{ key: any; value: any }> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => 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: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`\n );\n return;\n }\n\n const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function;\n\n if (!reflectPropCtor) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.`\n + MISSING_REFLECT_CONF_MSG,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function;\n\n if (!reflectCtor) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (!options.deserializer) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`\n );\n return;\n }\n }\n\n if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (!options.overwrite && target.prototype.toJSON) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","undefined","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","methodName","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","resultSet","i","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if (isValueDefined(serialized)\n // @todo check whether the or condition ever applies\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n // @todo check\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/deserializer.d.ts b/js/typedjson/deserializer.d.ts index 934eec6..13eefb5 100644 --- a/js/typedjson/deserializer.d.ts +++ b/js/typedjson/deserializer.d.ts @@ -23,6 +23,6 @@ export declare class Deserializer { instantiateType(ctor: any): any; mergeKnownTypes(...knownTypeMaps: Array>): Map; createKnownTypesMap(knowTypes: Set): Map; - private isExpectedMapShape; retrievePreserveNull(memberOptions?: OptionsBase): boolean; + private isExpectedMapShape; } diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts index d331900..43d9a94 100644 --- a/js/typedjson/metadata.d.ts +++ b/js/typedjson/metadata.d.ts @@ -22,24 +22,6 @@ export interface JsonMemberMetadata { serializer?: (value: any) => any; } export declare class JsonObjectMetadata { - /** - * Gets the name of a class as it appears in a serialized JSON string. - * @param ctor The constructor of a class (with or without jsonObject). - */ - static getJsonObjectName(ctor: Function): string; - /** - * Gets jsonObject metadata information from a class. - * @param ctor The constructor class. - */ - static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined; - static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata; - /** - * Gets the known type name of a jsonObject class for type hint. - * @param constructor The constructor class. - */ - static getKnownTypeNameFromType(constructor: Function): string; - private static doesHandleWithoutAnnotation; - constructor(classType: Function); dataMembers: Map; /** Set of known types used for polymorphic deserialization */ knownTypes: Set>; @@ -65,5 +47,23 @@ export declare class JsonObjectMetadata { onDeserializedMethodName?: string; beforeSerializationMethodName?: string; initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; + constructor(classType: Function); + /** + * Gets the name of a class as it appears in a serialized JSON string. + * @param ctor The constructor of a class (with or without jsonObject). + */ + static getJsonObjectName(ctor: Function): string; + /** + * Gets jsonObject metadata information from a class. + * @param ctor The constructor class. + */ + static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined; + static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata; + /** + * Gets the known type name of a jsonObject class for type hint. + * @param constructor The constructor class. + */ + static getKnownTypeNameFromType(constructor: Function): string; + private static doesHandleWithoutAnnotation; } export declare function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata): void; diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 7b1d878..b410ee7 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -11,7 +11,7 @@ describe('array of objects', () => { numProp: number; constructor(init?: {strProp: string; numProp: number}) { - if (init) { + if (init !== undefined) { this.strProp = init.strProp; this.numProp = init.numProp; } @@ -86,7 +86,7 @@ describe('multidimensional arrays', () => { arrayWithArray?: Array>; constructor(init?: IWithArrays) { - if (init) { + if (init !== undefined) { Object.assign(this, init); } } diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index c4898c7..4e66b48 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -91,12 +91,14 @@ describe('custom delegating array member serializer', () => { function objArrayDeserializer( values: Array<{prop: string; shouldDeserialize: boolean}> | undefined, ) { - if (values) { - return TypedJSON.parseAsArray( - values.filter(value => value.shouldDeserialize), - Inner, - ); + if (values === undefined) { + return; } + + return TypedJSON.parseAsArray( + values.filter(value => value.shouldDeserialize), + Inner, + ); } @jsonObject diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index 7ee3fd9..965eb91 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -76,7 +76,7 @@ beforeEach(() => { expected: number, ...customMsgs: Array ) { - const pass = actual && actual.length === expected; + const pass = actual?.length === expected; return { pass, message: util.buildFailureMessage( @@ -95,7 +95,7 @@ beforeEach(() => { const firstAsInt8Array: Int8Array | undefined = tryAsInt8Array(first); const secondAsInt8Array: Int8Array | undefined = tryAsInt8Array(second); - if (!firstAsInt8Array || !secondAsInt8Array) { + if (firstAsInt8Array === undefined || secondAsInt8Array === undefined) { return; } diff --git a/spec/map.spec.ts b/spec/map.spec.ts index 3b2a394..12b70d7 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -14,7 +14,7 @@ describe('map dictionary shape', () => { numProp: number; constructor(init?: {strProp: string; numProp: number}) { - if (init) { + if (init !== undefined) { this.strProp = init.strProp; this.numProp = init.numProp; } @@ -84,7 +84,7 @@ describe('map of array dictionary shape', () => { numProp: number; constructor(init?: {strProp: string; numProp: number}) { - if (init) { + if (init !== undefined) { this.strProp = init.strProp; this.numProp = init.numProp; } diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 206990f..387936d 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -11,7 +11,7 @@ describe('polymorphic custom names', () => { lastName: string; constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) { + if (firstName !== undefined && lastName !== undefined) { this.firstName = firstName; this.lastName = lastName; } @@ -32,7 +32,7 @@ describe('polymorphic custom names', () => { constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { super(firstName, lastName); - if (salary && joined) { + if (salary !== undefined && joined !== undefined) { this.salary = salary; this.joined = joined; } @@ -55,7 +55,7 @@ describe('polymorphic custom names', () => { constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); - this.investAmount = investAmount || 0; + this.investAmount = investAmount ?? 0; } } diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index 7790565..70cf1d0 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -21,7 +21,7 @@ describe('polymorphism custom type hints', () => { constructor(firstName?: string, lastName?: string); constructor(firstName: string, lastName: string); constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) { + if (firstName !== undefined && lastName !== undefined) { this.firstName = firstName; this.lastName = lastName; } @@ -38,7 +38,7 @@ describe('polymorphism custom type hints', () => { constructor(firstName?: string, lastName?: string, salary?: number) { super(firstName, lastName); - if (salary) { + if (salary !== undefined) { this.salary = salary; } } @@ -60,7 +60,7 @@ describe('polymorphism custom type hints', () => { constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); - this.investAmount = investAmount || 0; + this.investAmount = investAmount ?? 0; } } diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 9e8ff05..a20952b 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -13,7 +13,7 @@ describe('polymorphism', () => { constructor(); constructor(firstName: string, lastName: string); constructor(firstName?: string, lastName?: string) { - if (firstName && lastName) { + if (firstName !== undefined && lastName !== undefined) { this.firstName = firstName; this.lastName = lastName; } @@ -34,7 +34,7 @@ describe('polymorphism', () => { constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { super(firstName, lastName); - if (salary && joined) { + if (salary !== undefined && joined !== undefined) { this.salary = salary; this.joined = joined; } @@ -57,7 +57,7 @@ describe('polymorphism', () => { constructor(firstName?: string, lastName?: string, investAmount?: number) { super(firstName, lastName); - this.investAmount = investAmount || 0; + this.investAmount = investAmount ?? 0; } } diff --git a/spec/set.spec.ts b/spec/set.spec.ts index e066b28..ed98816 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -11,7 +11,7 @@ describe('set of objects', () => { numProp: number; constructor(init?: {strProp: string; numProp: number}) { - if (init) { + if (init !== undefined) { this.strProp = init.strProp; this.numProp = init.numProp; } @@ -106,7 +106,7 @@ describe('set array member', () => { numProp: number; constructor(init?: {strProp: string; numProp: number}) { - if (init) { + if (init !== undefined) { this.strProp = init.strProp; this.numProp = init.numProp; } diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index 2d54a1d..cca217e 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -97,7 +97,7 @@ export class Everything implements IEverything { // constHeteroEnum2: ConstHeteroEnum; // @jsonMember constructor(init?: IEverything) { - if (init) { + if (init !== undefined) { Object.assign(this, init); } } diff --git a/src/parser.ts b/src/parser.ts index e3313ff..aaaeacc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -49,7 +49,7 @@ export interface ITypedJSONSettings extends OptionsBase { export class TypedJSON { - private static _globalConfig: ITypedJSONSettings; + private static _globalConfig: ITypedJSONSettings | undefined; private serializer: Serializer = new Serializer(); private deserializer: Deserializer = new Deserializer(); @@ -69,7 +69,7 @@ export class TypedJSON { constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) { const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor); - if (!rootMetadata + if (rootMetadata === undefined || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { throw new TypeError( 'The TypedJSON root data type must have the @jsonObject decorator used.', @@ -80,9 +80,9 @@ export class TypedJSON { this.rootConstructor = rootConstructor; this.errorHandler = (error) => logError(error); - if (settings) { + if (settings !== undefined) { this.config(settings); - } else if (TypedJSON._globalConfig) { + } else if (TypedJSON._globalConfig !== undefined) { this.config({}); } } @@ -290,10 +290,10 @@ export class TypedJSON { } static setGlobalConfig(config: ITypedJSONSettings) { - if (this._globalConfig) { - Object.assign(this._globalConfig, config); - } else { + if (this._globalConfig === undefined) { this._globalConfig = config; + } else { + Object.assign(this._globalConfig, config); } } @@ -302,13 +302,14 @@ export class TypedJSON { * @param settings The configuration settings object. */ config(settings: ITypedJSONSettings) { - if (TypedJSON._globalConfig) { + if (TypedJSON._globalConfig !== undefined) { settings = { ...TypedJSON._globalConfig, ...settings, }; - if (settings.knownTypes && TypedJSON._globalConfig.knownTypes) { + if (settings.knownTypes !== undefined + && TypedJSON._globalConfig.knownTypes !== undefined) { // Merge known-types (also de-duplicate them, so Array -> Set -> Array). settings.knownTypes = Array.from(new Set( settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes), @@ -320,34 +321,34 @@ export class TypedJSON { this.serializer.options = options; this.deserializer.options = options; - if (settings.errorHandler) { + if (settings.errorHandler !== undefined) { this.errorHandler = settings.errorHandler; this.deserializer.setErrorHandler(settings.errorHandler); this.serializer.setErrorHandler(settings.errorHandler); } - if (settings.replacer) { + if (settings.replacer !== undefined) { this.replacer = settings.replacer; } - if (settings.typeResolver) { + if (settings.typeResolver !== undefined) { this.deserializer.setTypeResolver(settings.typeResolver); } - if (settings.typeHintEmitter) { + if (settings.typeHintEmitter !== undefined) { this.serializer.setTypeHintEmitter(settings.typeHintEmitter); } - if (settings.indent) { + if (settings.indent !== undefined) { this.indent = settings.indent; } - if (settings.nameResolver) { + if (settings.nameResolver !== undefined) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); // this.serializer.set } - if (settings.knownTypes) { + if (settings.knownTypes !== undefined) { // Type-check knownTypes elements to recognize errors in advance. - settings.knownTypes.forEach((knownType, i) => { + settings.knownTypes.forEach((knownType: any, i) => { // tslint:disable-next-line:no-null-keyword if (typeof knownType === 'undefined' || knownType === null) { logWarning( @@ -378,7 +379,7 @@ export class TypedJSON { knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); }); - if (rootMetadata) { + if (rootMetadata !== undefined) { rootMetadata.knownTypes.forEach(knownTypeCtor => { knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); }); diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 970828a..5fa9a55 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -15,7 +15,7 @@ export function defaultTypeResolver( sourceObject: IndexedObject, knownTypes: Map, ): Function | undefined { - if (sourceObject.__type) { + if (sourceObject.__type != null) { return knownTypes.get(sourceObject.__type); } } @@ -107,7 +107,7 @@ export class Deserializer { } const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer) { + if (deserializer !== undefined) { return deserializer( sourceObject, typeDescriptor, @@ -135,10 +135,10 @@ export class Deserializer { knownTypeMaps.forEach(knownTypes => { knownTypes.forEach((ctor, name) => { - if (this.nameResolver) { - result.set(this.nameResolver(ctor), ctor); - } else { + if (this.nameResolver === undefined) { result.set(name, ctor); + } else { + result.set(this.nameResolver(ctor), ctor); } }); }); @@ -150,14 +150,12 @@ export class Deserializer { const map = new Map(); knowTypes.forEach(ctor => { - if (this.nameResolver) { - map.set(this.nameResolver(ctor), ctor); - } else { + if (this.nameResolver === undefined) { const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor); - const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name - ? knownTypeMeta.name - : ctor.name; - map.set(name, ctor); + const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null; + map.set(name ?? ctor.name, ctor); + } else { + map.set(this.nameResolver(ctor), ctor); } }); @@ -201,7 +199,7 @@ function makeTypeErrorMessage( } function srcTypeNameForDebug(sourceObject: any) { - return sourceObject ? nameof(sourceObject.constructor) : 'undefined'; + return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor); } function deserializeDirectly( @@ -239,13 +237,13 @@ function convertAsObject( let knownTypeConstructors = knownTypes; let typeResolver = deserializer.getTypeResolver(); - if (sourceObjectMetadata) { + if (sourceObjectMetadata !== undefined) { // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = deserializer.mergeKnownTypes( knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes), ); - if (sourceObjectMetadata.typeResolver) { + if (sourceObjectMetadata.typeResolver !== undefined) { typeResolver = sourceObjectMetadata.typeResolver; } } @@ -253,14 +251,14 @@ function convertAsObject( // Check if a type-hint is available from the source object. const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint) { + if (typeFromTypeHint != null) { // Check if type hint is a valid subtype of the expected source type. if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { // Hell yes. expectedSelfType = typeFromTypeHint; sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata) { + if (sourceObjectMetadata !== undefined) { // Also merge new known types from subtype. knownTypeConstructors = deserializer.mergeKnownTypes( knownTypeConstructors, @@ -270,7 +268,7 @@ function convertAsObject( } } - if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked) { + if (sourceObjectMetadata?.isExplicitlyMarked === true) { const sourceMetadata = sourceObjectMetadata; // Strong-typed deserialization available, get to it. // First deserialize properties into a temporary object. @@ -285,9 +283,14 @@ function convertAsObject( const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let revivedValue; - if (objMemberMetadata.deserializer) { + if (objMemberMetadata.deserializer !== undefined) { revivedValue = objMemberMetadata.deserializer(objMemberValue); - } else if (objMemberMetadata.type) { + } else if (objMemberMetadata.type === undefined) { + throw new TypeError( + `Cannot deserialize ${objMemberDebugName} there is` + + ` no constructor nor deserialization function to use.`, + ); + } else { revivedValue = deserializer.convertSingleValue( objMemberValue, objMemberMetadata.type, @@ -295,18 +298,15 @@ function convertAsObject( objMemberDebugName, objMemberOptions, ); - } else { - throw new TypeError( - `Cannot deserialize ${objMemberDebugName} there is` - + ` no constructor nor deserialization function to use.`, - ); } + // @todo revivedValue will never be null in RHS of || if (isValueDefined(revivedValue) - || (deserializer.retrievePreserveNull(objMemberOptions) && revivedValue === null) + || (deserializer.retrievePreserveNull(objMemberOptions) + && revivedValue as any === null) ) { sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue; - } else if (objMemberMetadata.isRequired) { + } else if (objMemberMetadata.isRequired === true) { deserializer.getErrorHandler()(new TypeError( `Missing required member '${objMemberDebugName}'.`, )); @@ -324,7 +324,7 @@ function convertAsObject( ); // Check the validity of user-defined initializer callback. - if (!targetObject) { + if (targetObject as any === undefined) { throw new TypeError( `Cannot deserialize ${memberName}:` + ` 'initializer' function returned undefined/null` @@ -352,7 +352,7 @@ function convertAsObject( // Call onDeserialized method (if any). const methodName = sourceObjectMetadata.onDeserializedMethodName; - if (methodName) { + if (methodName !== undefined) { if (typeof (targetObject as any)[methodName] === 'function') { // check for member first (targetObject as any)[methodName](); @@ -406,7 +406,7 @@ function convertAsArray( return []; } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType as any == null) { deserializer.getErrorHandler()( new TypeError( `Could not deserialize ${memberName} as Array: missing constructor reference of` @@ -461,7 +461,7 @@ function convertAsSet( return new Set(); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType as any == null) { deserializer.getErrorHandler()( new TypeError( `Could not deserialize ${memberName} as Set: missing constructor reference of` @@ -520,14 +520,14 @@ function convertAsMap( return new Map(); } - if (!typeDescriptor.keyType) { + if (typeDescriptor.keyType as any == null) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`), ); return new Map(); } - if (!typeDescriptor.valueType) { + if (typeDescriptor.valueType as any == null) { deserializer.getErrorHandler()( new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`), ); diff --git a/src/typedjson/json-array-member.ts b/src/typedjson/json-array-member.ts index c51884c..d2202ec 100644 --- a/src/typedjson/json-array-member.ts +++ b/src/typedjson/json-array-member.ts @@ -76,7 +76,7 @@ export function jsonArrayMember( isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: options.name ?? propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); diff --git a/src/typedjson/json-map-member.ts b/src/typedjson/json-map-member.ts index 89a46ea..a117d39 100644 --- a/src/typedjson/json-map-member.ts +++ b/src/typedjson/json-map-member.ts @@ -67,7 +67,7 @@ export function jsonMapMember( isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: options.name ?? propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index 5697e02..0d6e7e0 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -70,7 +70,10 @@ export function jsonMember( optionsOrPrototype?: IJsonMemberOptions | IndexedObject, propKey?: string | symbol, ): PropertyDecorator | void { - if (propKey && (typeof propKey === 'string' || typeof propKey === 'symbol')) { + // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string + // The check is not required. + if (propKey !== undefined + && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) { const prototype = optionsOrPrototype as IndexedObject; // For error messages. const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; @@ -86,9 +89,10 @@ export function jsonMember( return; } - const reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey) as Function; + const reflectPropCtor: Function | null | undefined = + Reflect.getMetadata('design:type', prototype, propKey); - if (!reflectPropCtor) { + if (reflectPropCtor == null) { logError( `${decoratorName}: could not resolve detected property constructor at runtime.${ MISSING_REFLECT_CONF_MSG}`, @@ -109,7 +113,7 @@ export function jsonMember( } else { // jsonMember used as a decorator factory. return (target: Object, _propKey: string | symbol) => { - const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions || {}; + const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {}; let typeDescriptor: TypeDescriptor | undefined; const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; @@ -142,9 +146,9 @@ export function jsonMember( 'design:type', target, _propKey, - ) as Function; + ) as Function | null | undefined; - if (!reflectCtor) { + if (reflectCtor == null) { logError( `${decoratorName}: cannot resolve detected property constructor at` + ` runtime.`, @@ -152,7 +156,7 @@ export function jsonMember( return; } typeDescriptor = ensureTypeDescriptor(reflectCtor); - } else if (!options.deserializer) { + } else if (options.deserializer === undefined) { logError( `${decoratorName}: ReflectDecorators is required if no 'constructor' option` + ` is specified.`, @@ -161,7 +165,8 @@ export function jsonMember( } } - if (typeDescriptor && isSpecialPropertyType(decoratorName, typeDescriptor)) { + if (typeDescriptor !== undefined + && isSpecialPropertyType(decoratorName, typeDescriptor)) { return; } injectMetadataInformation(target, _propKey, { @@ -170,7 +175,7 @@ export function jsonMember( isRequired: options.isRequired, options: extractOptionBase(options), key: _propKey.toString(), - name: options.name || _propKey.toString(), + name: options.name ?? _propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index 7fb31e3..c294780 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -91,7 +91,7 @@ export function jsonObject( options = {}; } else { // jsonObject is being used as a decorator factory. - options = optionsOrTarget || {}; + options = optionsOrTarget ?? {}; } function decorator( @@ -105,24 +105,24 @@ export function jsonObject( objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver) { + if (options.typeResolver !== undefined) { objectMetadata.typeResolver = options.typeResolver; } - if (options.typeHintEmitter) { + if (options.typeHintEmitter !== undefined) { objectMetadata.typeHintEmitter = options.typeHintEmitter; } // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer as any; - if (options.name) { + if (options.name !== undefined) { objectMetadata.name = options.name; } const optionsBase = extractOptionBase(options); - if (optionsBase) { + if (optionsBase !== undefined) { objectMetadata.options = optionsBase; } - if (options.knownTypes) { + if (options.knownTypes !== undefined) { options.knownTypes .filter(knownType => Boolean(knownType)) .forEach(knownType => objectMetadata.knownTypes.add(knownType)); diff --git a/src/typedjson/json-set-member.ts b/src/typedjson/json-set-member.ts index 624047d..2169fa4 100644 --- a/src/typedjson/json-set-member.ts +++ b/src/typedjson/json-set-member.ts @@ -58,7 +58,7 @@ export function jsonSetMember(elementConstructor: Function, options: IJsonSetMem isRequired: options.isRequired, options: extractOptionBase(options), key: propKey.toString(), - name: options.name || propKey.toString(), + name: options.name ?? propKey.toString(), deserializer: options.deserializer, serializer: options.serializer, }); diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index ab480b7..0e10a9e 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -91,7 +91,7 @@ export class JsonObjectMetadata { */ static getJsonObjectName(ctor: Function): string { const metadata = JsonObjectMetadata.getFromConstructor(ctor); - return metadata ? nameof(metadata.classType) : nameof(ctor); + return metadata === undefined ? nameof(ctor) : nameof(metadata.classType); } /** @@ -100,18 +100,18 @@ export class JsonObjectMetadata { */ static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined { const prototype = ctor.prototype; - if (!prototype) { + if (prototype == null) { return; } let metadata: JsonObjectMetadata | undefined; - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { + if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) { // The class prototype contains own jsonObject metadata metadata = prototype[METADATA_FIELD_KEY]; } // Ignore implicitly added jsonObject (through jsonMember) - if (metadata && metadata.isExplicitlyMarked) { + if (metadata?.isExplicitlyMarked === true) { return metadata; } @@ -132,8 +132,8 @@ export class JsonObjectMetadata { const objectMetadata = new JsonObjectMetadata(prototype.constructor); // Inherit json members and known types from parent @jsonObject (if any). - const parentMetadata: JsonObjectMetadata = prototype[METADATA_FIELD_KEY]; - if (parentMetadata) { + const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY]; + if (parentMetadata !== undefined) { parentMetadata.dataMembers.forEach((memberMetadata, propKey) => { objectMetadata.dataMembers.set(propKey, memberMetadata); }); @@ -159,7 +159,7 @@ export class JsonObjectMetadata { */ static getKnownTypeNameFromType(constructor: Function): string { const metadata = JsonObjectMetadata.getFromConstructor(constructor); - return metadata ? nameof(metadata.classType) : nameof(constructor); + return metadata === undefined ? nameof(constructor) : nameof(metadata.classType); } private static doesHandleWithoutAnnotation(ctor: Function): boolean { @@ -182,19 +182,21 @@ export function injectMetadataInformation( // eslint-disable-next-line max-len // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators // ... and static members are not supported here, so abort. - if (typeof prototype === 'function') { + if (typeof prototype as any === 'function') { logError(`${decoratorName}: cannot use a static property.`); return; } // Methods cannot be serialized. - // @ts-ignore symbol indexing is not supported by ts - if (typeof prototype[propKey] === 'function') { + // symbol indexing is not supported by ts + if (typeof prototype[propKey as string] === 'function') { logError(`${decoratorName}: cannot use a method property.`); return; } - if (!metadata || (!metadata.type && !metadata.deserializer)) { + // @todo check if metadata is ever undefined, if so, change parameter type + if (metadata as any === undefined + || (metadata.type === undefined && metadata.deserializer === undefined)) { logError(`${decoratorName}: JsonMemberMetadata has unknown type.`); return; } @@ -204,9 +206,9 @@ export function injectMetadataInformation( // with '@jsonObject' as well. const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype); - if (!metadata.deserializer) { - // @ts-ignore above is a check (!deser && !ctor) - metadata.type.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor)); + if (metadata.deserializer === undefined) { + // If deserializer is not present then type must be + metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor)); } // clear metadata of undefined properties to save memory diff --git a/src/typedjson/options-base.ts b/src/typedjson/options-base.ts index cd1815b..ed49089 100644 --- a/src/typedjson/options-base.ts +++ b/src/typedjson/options-base.ts @@ -41,7 +41,7 @@ export function getOptionValue( key: K, options?: OptionsBase, ): Required[K] { - if (options && options[key] != null) { + if (options?.[key] !== undefined) { return options[key]!; } return getDefaultOptionOf(key); @@ -51,7 +51,7 @@ export function mergeOptions( existing?: OptionsBase, moreSpecific?: OptionsBase, ): OptionsBase | undefined { - return !moreSpecific + return moreSpecific === undefined ? existing : { diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index d5706a4..a07b3d8 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -28,9 +28,7 @@ export function defaultTypeEmitter( // the required known-types are defined, and the object is a valid subtype of the expected // type). if (sourceObject.constructor !== expectedSourceType) { - targetObject.__type = sourceTypeMetadata && sourceTypeMetadata.name - ? sourceTypeMetadata.name - : nameof(sourceObject.constructor); + targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor); } } @@ -94,7 +92,7 @@ export class Serializer { ]); setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) { - if (typeof typeEmitterCallback !== 'function') { + if (typeof typeEmitterCallback as any !== 'function') { throw new TypeError('\'typeEmitterCallback\' is not a function.'); } @@ -106,7 +104,7 @@ export class Serializer { } setErrorHandler(errorHandlerCallback: (error: Error) => void) { - if (typeof errorHandlerCallback !== 'function') { + if (typeof errorHandlerCallback as any !== 'function') { throw new TypeError('\'errorHandlerCallback\' is not a function.'); } @@ -150,7 +148,7 @@ export class Serializer { } const serializer = this.serializationStrategy.get(typeDescriptor.ctor); - if (serializer) { + if (serializer !== undefined) { return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); } // if not present in the strategy do property by property serialization @@ -187,9 +185,15 @@ function convertAsObject( sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); } - if (sourceTypeMetadata) { + if (sourceTypeMetadata === undefined) { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = {...sourceObject}; + } else { const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; - if (beforeSerializationMethodName) { + if (beforeSerializationMethodName !== undefined) { if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') { // check for member first (sourceObject as any)[beforeSerializationMethodName](); @@ -215,41 +219,37 @@ function convertAsObject( targetObject = {}; const classOptions = mergeOptions(serializer.options, sourceMeta.options); - if (sourceMeta.typeHintEmitter) { + if (sourceMeta.typeHintEmitter !== undefined) { typeHintEmitter = sourceMeta.typeHintEmitter; } sourceMeta.dataMembers.forEach((objMemberMetadata) => { const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let serialized; - if (objMemberMetadata.serializer) { + if (objMemberMetadata.serializer !== undefined) { serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } else if (objMemberMetadata.type) { + } else if (objMemberMetadata.type === undefined) { + throw new TypeError( + `Could not serialize ${objMemberMetadata.name}, there is` + + ` no constructor nor serialization function to use.`, + ); + } else { serialized = serializer.convertSingleValue( sourceObject[objMemberMetadata.key], objMemberMetadata.type, `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`, objMemberOptions, ); - } else { - throw new TypeError( - `Could not serialize ${objMemberMetadata.name}, there is` - + ` no constructor nor serialization function to use.`, - ); } if (isValueDefined(serialized) + // @todo check whether the or condition ever applies + // eslint-disable-next-line @typescript-eslint/tslint/config || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null) ) { targetObject[objMemberMetadata.name] = serialized; } }); - } else { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = {...sourceObject}; } // Add type-hint. @@ -276,7 +276,7 @@ function convertAsArray( + ' use proper annotation or function for this type', ); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType as any == null) { throw new TypeError( `Could not serialize ${memberName} as Array: missing element type definition.`, ); @@ -292,12 +292,15 @@ function convertAsArray( && !isInstanceOf(element, typeDescriptor.elementType.ctor) ) { const expectedTypeName = nameof(typeDescriptor.elementType.ctor); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions const actualTypeName = element && nameof(element.constructor); throw new TypeError(`Could not serialize ${memberName}[${i}]:` + ` expected '${expectedTypeName}', got '${actualTypeName}'.`); } }); + // @todo, is this necessary? + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { // Just for debugging purposes. memberName += '[]'; @@ -331,13 +334,15 @@ function convertAsSet( + ' use proper annotation or function for this type', ); } - if (!typeDescriptor.elementType) { + if (typeDescriptor.elementType as any == null) { throw new TypeError( `Could not serialize ${memberName} as Set: missing element type definition.`, ); } // For debugging and error tracking. + // @todo, is this necessary? + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { memberName += '[]'; } @@ -384,18 +389,19 @@ function convertAsMap( + ' use proper annotation or function for this type', ); } - if (!typeDescriptor.valueType) { + if (typeDescriptor.valueType as any == null) { // @todo Check type throw new TypeError( `Could not serialize ${memberName} as Map: missing value type definition.`, ); } - if (!typeDescriptor.keyType) { + if (typeDescriptor.keyType as any == null) { // @todo Check type throw new TypeError( `Could not serialize ${memberName} as Map: missing key type definition.`, ); } + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (memberName) { memberName += '[]'; } @@ -425,6 +431,8 @@ function convertAsMap( // We are not going to emit entries with undefined keys OR undefined values. const keyDefined = isValueDefined(resultKeyValuePairObj.key); const valueDefined = isValueDefined(resultKeyValuePairObj.value) + // @todo check + // eslint-disable-next-line @typescript-eslint/tslint/config || (resultKeyValuePairObj.value === null && preserveNull); if (keyDefined && valueDefined) { if (resultShape === MapShape.OBJECT) { diff --git a/src/typedjson/to-json.ts b/src/typedjson/to-json.ts index f7571ac..3556f73 100644 --- a/src/typedjson/to-json.ts +++ b/src/typedjson/to-json.ts @@ -38,7 +38,7 @@ export function toJson( } function toJsonDecorator(target: Function, options: IToJsonOptions): void { - if (!options.overwrite && target.prototype.toJSON) { + if (options.overwrite !== true && target.prototype.toJSON !== undefined) { throw new Error(`${target.name} already has toJSON defined!`); } target.prototype.toJSON = function () { diff --git a/src/typedjson/type-descriptor.ts b/src/typedjson/type-descriptor.ts index b560697..a0e2a2d 100644 --- a/src/typedjson/type-descriptor.ts +++ b/src/typedjson/type-descriptor.ts @@ -84,7 +84,7 @@ export class MapTypeDescriptor extends GenericTypeDescriptor { getCompleteOptions(): MapOptions { return { - shape: this.options?.shape ? this.options.shape : MapShape.ARRAY, + shape: this.options?.shape ?? MapShape.ARRAY, }; } } @@ -117,7 +117,7 @@ export function MapT( // } export function isTypelike(type: any): type is Typelike { - return type && (typeof type === 'function' || type instanceof TypeDescriptor); + return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); } export function ensureTypeDescriptor(type: Typelike): TypeDescriptor { From 7d238209eb59d2ed9e66587c23529c8fb2d95756 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 16:36:49 +0000 Subject: [PATCH 021/119] Fix filename casing -> kebab-case --- .../{beforeSerialization.spec.ts => before-serialization.spec.ts} | 0 spec/{onDeserialized.spec.ts => on-deserialized.spec.ts} | 0 spec/{preserveNull.spec.ts => preserve-null.spec.ts} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename spec/{beforeSerialization.spec.ts => before-serialization.spec.ts} (100%) rename spec/{onDeserialized.spec.ts => on-deserialized.spec.ts} (100%) rename spec/{preserveNull.spec.ts => preserve-null.spec.ts} (100%) diff --git a/spec/beforeSerialization.spec.ts b/spec/before-serialization.spec.ts similarity index 100% rename from spec/beforeSerialization.spec.ts rename to spec/before-serialization.spec.ts diff --git a/spec/onDeserialized.spec.ts b/spec/on-deserialized.spec.ts similarity index 100% rename from spec/onDeserialized.spec.ts rename to spec/on-deserialized.spec.ts diff --git a/spec/preserveNull.spec.ts b/spec/preserve-null.spec.ts similarity index 100% rename from spec/preserveNull.spec.ts rename to spec/preserve-null.spec.ts From 18aefe9921d9448aa0dd136b5de6b3cb0a5008d3 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:13:19 +0000 Subject: [PATCH 022/119] Fix negated conditions --- spec/utils/object-compare.ts | 39 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/spec/utils/object-compare.ts b/spec/utils/object-compare.ts index bf8b962..3c3d88d 100644 --- a/spec/utils/object-compare.ts +++ b/spec/utils/object-compare.ts @@ -3,16 +3,7 @@ export function isEqual(a: T, b: T): boolean; export function isEqual(a: Array, b: Array): boolean; export function isEqual(a: any, b: any): boolean { if (typeof a === 'object') { - if (Object.keys(a).length !== Object.keys(b).length) { - // 'b' has a different number of properties, and thus can no longer be considered equal. - console.warn( - `Property count mismatch (a: ${Object.keys(a).length} keys,` - + ` b: ${Object.keys(b).length} keys) on:`, - ); - console.warn(a); - console.warn(b); - return false; - } else { + if (Object.keys(a).length === Object.keys(b).length) { // Alphabetical iteration over object property keys. return Object.keys(a).sort().reduce((acc, k) => { if (typeof a[k] === 'function' && typeof b[k] === 'function') { @@ -21,17 +12,18 @@ export function isEqual(a: any, b: any): boolean { return acc && isEqual(a[k], b[k]); } }, true); - } - } else if (a instanceof Array && b instanceof Array) { - if (a.length !== b.length) { - // 'b' has a different number of elements, not equal. + } else { + // 'b' has a different number of properties, and thus can no longer be considered equal. console.warn( - `Array length mismatch (a: ${a.length} elements, b: ${b.length} elements) on:`, + `Property count mismatch (a: ${Object.keys(a).length} keys,` + + ` b: ${Object.keys(b).length} keys) on:`, ); console.warn(a); console.warn(b); return false; - } else { + } + } else if (a instanceof Array && b instanceof Array) { + if (a.length === b.length) { // Compare all Array elements recursively. for (let i = 0; i < a.length; i++) { if (!isEqual(a[i], b[i])) { @@ -39,12 +31,19 @@ export function isEqual(a: any, b: any): boolean { return false; } } + } else { + // 'b' has a different number of elements, not equal. + console.warn( + `Array length mismatch (a: ${a.length} elements, b: ${b.length} elements) on:`, + ); + console.warn(a); + console.warn(b); + return false; } - } else if (a !== b) { - console.warn(`Value mismatch (a: '${a}', b: '${b}').`); - return false; - } else { + } else if (a === b) { return true; } + + console.warn(`Value mismatch (a: '${a}', b: '${b}').`); return false; } From 35a63f1d006ab9173cb8491cb3a4f67f977c00a5 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:16:24 +0000 Subject: [PATCH 023/119] Merge if in json-member --- src/typedjson/json-member.ts | 37 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index 0d6e7e0..afbc089 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -139,30 +139,27 @@ export function jsonMember( + ` 'constructor' option.`, ); } - } else { - // Use ReflectDecorators to obtain property constructor. - if (isReflectMetadataSupported) { - const reflectCtor = Reflect.getMetadata( - 'design:type', - target, - _propKey, - ) as Function | null | undefined; - - if (reflectCtor == null) { - logError( - `${decoratorName}: cannot resolve detected property constructor at` - + ` runtime.`, - ); - return; - } - typeDescriptor = ensureTypeDescriptor(reflectCtor); - } else if (options.deserializer === undefined) { + } else if (isReflectMetadataSupported) { + const reflectCtor = Reflect.getMetadata( + 'design:type', + target, + _propKey, + ) as Function | null | undefined; + + if (reflectCtor == null) { logError( - `${decoratorName}: ReflectDecorators is required if no 'constructor' option` - + ` is specified.`, + `${decoratorName}: cannot resolve detected property constructor at` + + ` runtime.`, ); return; } + typeDescriptor = ensureTypeDescriptor(reflectCtor); + } else if (options.deserializer === undefined) { + logError( + `${decoratorName}: ReflectDecorators is required if no 'constructor' option` + + ` is specified.`, + ); + return; } if (typeDescriptor !== undefined From c5898d1aa4d98a3d258f22eea30de0c256dbeb7e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:17:26 +0000 Subject: [PATCH 024/119] Fix empty block in just-json.spec.ts --- spec/just-json.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index d7ffb5c..1ba10ad 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -13,6 +13,7 @@ describe('json (without automatic stringify)', () => { expect(TypedJSON.parse('"sdfs"fdsf"', String)).toEqual(undefined); fail(); } catch (e) { + // Ignore error } }); From 03ccff8e26209e77b40b703c8e68fb108ef5ab5f Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:19:15 +0000 Subject: [PATCH 025/119] Fix var usage in polymorphism-nested-arrays.spec.ts --- spec/polymorphism-nested-arrays.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index 24770d9..76a702e 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -60,10 +60,10 @@ describe('polymorphism in nested arrays', () => { function test(log: boolean) { const graph = new Graph(); - for (var i = 0; i < 20; i++) { + for (let i = 0; i < 20; i++) { graph.smallItems.push([]); - for (var j = 0; j < 8; j++) { + for (let j = 0; j < 8; j++) { const node = new SmallNode(); node.name = `smallnode_${i}_${j}`; @@ -74,10 +74,10 @@ describe('polymorphism in nested arrays', () => { } } - for (var i = 0; i < 20; i++) { + for (let i = 0; i < 20; i++) { graph.items.push([]); - for (var j = 0; j < 8; j++) { + for (let j = 0; j < 8; j++) { let node: Node; if (Math.random() < 0.25) { From afc8890a53f295a343cd8ca88537349fada89807 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:22:22 +0000 Subject: [PATCH 026/119] Fix TYPE_MAP usage/assignment location --- spec/polymorphism-custom-type-hints.spec.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index 70cf1d0..f168871 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -3,8 +3,6 @@ import {IndexedObject} from '../src/typedjson/types'; describe('polymorphism custom type hints', () => { describe('should work for a base class', () => { - let TYPE_MAP: IndexedObject; - @jsonObject({ typeHintEmitter: (targetObject, sourceObject) => { return targetObject.personType = `${sourceObject.constructor.name}Type`; @@ -64,7 +62,7 @@ describe('polymorphism custom type hints', () => { } } - TYPE_MAP = { + const TYPE_MAP: IndexedObject = { EmployeeType: Employee, PartTimeEmployeeType: PartTimeEmployee, InvestorType: Investor, From 34056b934edfb7c999d56078919b291933c54b6c Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:24:05 +0000 Subject: [PATCH 027/119] Do not return in typeHintEmitter --- spec/polymorphism-custom-type-hints.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index f168871..7827741 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -5,7 +5,7 @@ describe('polymorphism custom type hints', () => { describe('should work for a base class', () => { @jsonObject({ typeHintEmitter: (targetObject, sourceObject) => { - return targetObject.personType = `${sourceObject.constructor.name}Type`; + targetObject.personType = `${sourceObject.constructor.name}Type`; }, typeResolver: sourceObject => TYPE_MAP[sourceObject.personType], }) From 7e8cc1c7b5c94b223c53ce81e9121289a2c5f3fe Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:24:55 +0000 Subject: [PATCH 028/119] Fix function name in to-json.ts --- src/typedjson/to-json.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typedjson/to-json.ts b/src/typedjson/to-json.ts index 3556f73..e138377 100644 --- a/src/typedjson/to-json.ts +++ b/src/typedjson/to-json.ts @@ -41,7 +41,7 @@ function toJsonDecorator(target: Function, options: IToJsonOpt if (options.overwrite !== true && target.prototype.toJSON !== undefined) { throw new Error(`${target.name} already has toJSON defined!`); } - target.prototype.toJSON = function () { + target.prototype.toJSON = function toJSON() { return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor); }; } From a9e0468b8c50e7847f7ff905b5c6ef1a35147089 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:33:06 +0000 Subject: [PATCH 029/119] Fix strict type predicates --- src/typedjson/deserializer.ts | 6 +++--- src/typedjson/helpers.ts | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 5fa9a55..ca0df1f 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -70,7 +70,7 @@ export class Deserializer { } setTypeResolver(typeResolverCallback: TypeResolver) { - if (typeof typeResolverCallback !== 'function') { + if (typeof typeResolverCallback as any !== 'function') { throw new TypeError('\'typeResolverCallback\' is not a function.'); } @@ -82,7 +82,7 @@ export class Deserializer { } setErrorHandler(errorHandlerCallback: (error: Error) => void) { - if (typeof errorHandlerCallback !== 'function') { + if (typeof errorHandlerCallback as any !== 'function') { throw new TypeError('\'errorHandlerCallback\' is not a function.'); } @@ -225,7 +225,7 @@ function convertAsObject( memberName: string, deserializer: Deserializer, ): IndexedObject | T | undefined { - if (typeof sourceObject !== 'object' || sourceObject === null) { + if (typeof sourceObject as any !== 'object' || sourceObject as any === null) { deserializer.getErrorHandler()(new TypeError( `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`, )); diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 5dbf69d..af7904a 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -71,23 +71,23 @@ export function isSubtypeOf(A: Function, B: Function) { } export function logError(message?: any, ...optionalParams: Array) { - if (typeof console === 'object' && typeof console.error === 'function') { + if (typeof console as any === 'object' && typeof console.error as any === 'function') { console.error(message, ...optionalParams); - } else if (typeof console === 'object' && typeof console.log === 'function') { + } else if (typeof console as any === 'object' && typeof console.log as any === 'function') { console.log(`ERROR: ${message}`, ...optionalParams); } } export function logMessage(message?: any, ...optionalParams: Array) { - if (typeof console === 'object' && typeof console.log === 'function') { + if (typeof console as any === 'object' && typeof console.log as any === 'function') { console.log(message, ...optionalParams); } } export function logWarning(message?: any, ...optionalParams: Array) { - if (typeof console === 'object' && typeof console.warn === 'function') { + if (typeof console as any === 'object' && typeof console.warn as any === 'function') { console.warn(message, ...optionalParams); - } else if (typeof console === 'object' && typeof console.log === 'function') { + } else if (typeof console as any === 'object' && typeof console.log as any === 'function') { console.log(`WARNING: ${message}`, ...optionalParams); } } @@ -115,14 +115,14 @@ export function isInstanceOf(value: any, constructor: Function): boolean { } export const isReflectMetadataSupported = - typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; + typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === 'function'; /** * Gets the name of a function. * @param fn The function whose name to get. */ export function nameof(fn: Function & {name?: string}) { - if (typeof fn.name === 'string') { + if (typeof fn.name as string | undefined === 'string') { return fn.name; } return 'undefined'; From 2049f8bdf4ba3a477dd1d62916660214fcab92f5 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:41:44 +0000 Subject: [PATCH 030/119] Replace boolean + bitwise with indexOf --- src/typedjson/helpers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index af7904a..6fb0ef0 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -15,15 +15,15 @@ export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "exper * for `number`). */ export function isDirectlySerializableNativeType(type: Function): boolean { - return Boolean(~[Date, Number, String, Boolean].indexOf(type as any)); + return [Date, Number, String, Boolean].indexOf(type as any) !== -1; } export function isDirectlyDeserializableNativeType(type: Function): boolean { - return Boolean(~[Number, String, Boolean].indexOf(type as any)); + return [Number, String, Boolean].indexOf(type as any) !== -1; } export function isTypeTypedArray(type: Function): boolean { - return Boolean(~[ + return [ Float32Array, Float64Array, Int8Array, @@ -33,7 +33,7 @@ export function isTypeTypedArray(type: Function): boolean { Uint16Array, Int32Array, Uint32Array, - ].indexOf(type as any)); + ].indexOf(type as any) !== -1; } export function isObject(value: any): value is Object { From 80406d653285dcc39a4843004c6839dd3ac4d8bb Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 21:50:21 +0000 Subject: [PATCH 031/119] Ignore double ~ until intent is clear --- src/typedjson/deserializer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index ca0df1f..f85d748 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -687,6 +687,7 @@ function convertAsFloatArray( ); } +// @todo: investigate bitwise and types function convertAsUintArray( sourceObject: string | number | Date, typeDescriptor: TypeDescriptor, @@ -695,6 +696,7 @@ function convertAsUintArray; if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) { + // eslint-disable-next-line no-bitwise return new constructor(sourceObject.map(value => ~~value)); } return throwTypeMismatchError( From ca107e07979e86b0a923b18eb6bef3bae939df9e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 22:04:56 +0000 Subject: [PATCH 032/119] Ignore custom jasmine type in matchers.ts --- spec/helpers/matchers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index 965eb91..07e878b 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -114,6 +114,7 @@ function tryAsInt8Array(obj: any): Int8Array | undefined { } } +// eslint-disable-next-line @typescript-eslint/no-namespace declare namespace jasmine { /* eslint-disable @typescript-eslint/method-signature-style */ interface Matchers { From e80a0bf152bf4fde7c964db00d08c5df74d41933 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 22:07:56 +0000 Subject: [PATCH 033/119] Replace equal with tripe equal comparison --- spec/helpers/matchers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/helpers/matchers.ts b/spec/helpers/matchers.ts index 07e878b..883078a 100644 --- a/spec/helpers/matchers.ts +++ b/spec/helpers/matchers.ts @@ -102,7 +102,7 @@ beforeEach(() => { if (firstAsInt8Array.length !== secondAsInt8Array.length) { return false; } - return firstAsInt8Array.every((num, i) => num == secondAsInt8Array[i]); + return firstAsInt8Array.every((num, i) => num === secondAsInt8Array[i]); }); }); From 16ab9c56ae60891aef907b6db6e903ba1acf6e34 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 22:09:45 +0000 Subject: [PATCH 034/119] Allow @ts-ignore on delete TypedJSON._globalConfig --- spec/preserve-null.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/preserve-null.spec.ts b/spec/preserve-null.spec.ts index 255e4fe..2b8d42d 100644 --- a/spec/preserve-null.spec.ts +++ b/spec/preserve-null.spec.ts @@ -18,6 +18,7 @@ describe('preserveNull', () => { const obj = TypedJSON.parse({name: null}, Person); expect(obj).toEqual(input); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore delete TypedJSON._globalConfig; }); From b3859692e6c6ece2bcc46aa09aab866d4c16ec05 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 22:13:13 +0000 Subject: [PATCH 035/119] Update CI Node matrix to supported versions --- .github/workflows/nodejs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 97c36fb..8196d89 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [8.x, 10.x, 12.x] + node-version: [10.x, 12.x, 14.x] steps: - uses: actions/checkout@v1 From f7b30682c0a5048a38d95c6f32162cc1c899b660 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 22:51:10 +0000 Subject: [PATCH 036/119] Prevent double build on commit --- lint-staged.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lint-staged.config.js b/lint-staged.config.js index 439ad12..915183a 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -4,7 +4,6 @@ function mapFilenames(filenames) { module.exports = { '*': () => [ - 'npm run build', 'npm run test', ], '*.ts': (filenames) => [ From 4a86e042a8d0cea3691c93a38bbaebe4320f0ebd Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 00:40:43 +0000 Subject: [PATCH 037/119] Configure linter for jasmine specific rules --- .eslintrc.yaml | 23 +++++++++++++++++++++++ package-lock.json | 6 ++++++ package.json | 1 + 3 files changed, 30 insertions(+) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 7edccea..c65a1e8 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -25,9 +25,32 @@ overrides: project: - tsconfig/tsconfig.lint.json sourceType: module + + plugins: + - jasmine + rules: '@typescript-eslint/no-use-before-define': off func-names: off + jasmine/expect-matcher: error + jasmine/expect-single-argument: error + jasmine/missing-expect: error + jasmine/named-spy: off # We might consider this + jasmine/no-assign-spyon: error + jasmine/no-describe-variables: error + jasmine/no-disabled-tests: error + jasmine/no-expect-in-setup-teardown: error + jasmine/no-focused-tests: error + jasmine/no-global-setup: error + jasmine/no-pending-tests: warn + jasmine/no-promise-without-done-fail: error + jasmine/no-spec-dupes: + - error + - branch + jasmine/no-suite-callback-args: error + jasmine/no-suite-dupes: error + jasmine/no-unsafe-spy: error + jasmine/prefer-jasmine-matcher: error - files: diff --git a/package-lock.json b/package-lock.json index 5e8c738..4453f64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2182,6 +2182,12 @@ } } }, + "eslint-plugin-jasmine": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz", + "integrity": "sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw==", + "dev": true + }, "eslint-plugin-unicorn": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", diff --git a/package.json b/package.json index 10e31f6..bcad29d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@matthiaskunnen/eslint-config-typescript": "^1.2.0", "@types/jasmine": "^3.5.3", + "eslint-plugin-jasmine": "^4.1.1", "husky": "^4.2.5", "jasmine": "^3.5.0", "lint-staged": "^10.2.13", From 6d334be30e0257d3b3a440024d132d236d4247fd Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:00:32 +0000 Subject: [PATCH 038/119] Remove todo for isValueDefined OR expression --- src/typedjson/serializer.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index a07b3d8..7d1ff07 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -242,10 +242,8 @@ function convertAsObject( ); } - if (isValueDefined(serialized) - // @todo check whether the or condition ever applies - // eslint-disable-next-line @typescript-eslint/tslint/config - || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null) + if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null) + || isValueDefined(serialized) ) { targetObject[objMemberMetadata.name] = serialized; } @@ -430,10 +428,8 @@ function convertAsMap( // We are not going to emit entries with undefined keys OR undefined values. const keyDefined = isValueDefined(resultKeyValuePairObj.key); - const valueDefined = isValueDefined(resultKeyValuePairObj.value) - // @todo check - // eslint-disable-next-line @typescript-eslint/tslint/config - || (resultKeyValuePairObj.value === null && preserveNull); + const valueDefined = (resultKeyValuePairObj.value === null && preserveNull) + || isValueDefined(resultKeyValuePairObj.value); if (keyDefined && valueDefined) { if (resultShape === MapShape.OBJECT) { result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; From 758d3362a27936524632eb189784d278df7a390e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:06:39 +0000 Subject: [PATCH 039/119] Remove memberName empty array padding in serializer --- src/typedjson/serializer.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 7d1ff07..32eed68 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -297,13 +297,6 @@ function convertAsArray( } }); - // @todo, is this necessary? - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - // Just for debugging purposes. - memberName += '[]'; - } - return sourceObject.map(element => { return serializer.convertSingleValue( element, @@ -338,13 +331,6 @@ function convertAsSet( ); } - // For debugging and error tracking. - // @todo, is this necessary? - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - memberName += '[]'; - } - const resultArray: Array = []; // Convert each element of the set, and put it into an output array. @@ -399,11 +385,6 @@ function convertAsMap( ); } - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - memberName += '[]'; - } - // const resultArray: Array<{ key: any, value: any }> = []; const resultShape = typeDescriptor.getCompleteOptions().shape; const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : []; From ac19b3213901cf910b34ab80fe2bebd57700c78f Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:08:02 +0000 Subject: [PATCH 040/119] Fix refactor of comments in everything.ts --- spec/utils/everything.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index cca217e..5fb093a 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -66,15 +66,14 @@ export interface IEverything { export class Everything implements IEverything { @jsonMember strProp: string; - @jsonMember numProp: number; - @jsonMember boolProp: boolean; @jsonMember dateProp: Date; // @jsonMember + // nullable: {}|null; @jsonMember optional?: {}; @jsonMember @@ -96,13 +95,14 @@ export class Everything implements IEverything { // @jsonMember // constHeteroEnum2: ConstHeteroEnum; // @jsonMember + // [symbolProp]: string; + constructor(init?: IEverything) { if (init !== undefined) { Object.assign(this, init); } } - // [symbolProp]: string; static create(): IEverything { return { strProp: 'string', @@ -123,7 +123,6 @@ export class Everything implements IEverything { }; } - // nullable: {}|null; static expected(): Everything { const obj = Everything.create(); // properties that are undefined are not serialized From 7a7de633667fe3b44a7ab6f5fbcb87386098349c Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:17:33 +0000 Subject: [PATCH 041/119] Make null checks more defensive for user supplied values --- js/parser.d.ts | 14 +- js/typedjson.js | 1914 +-------------------------------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 +- js/typedjson.min.js.map | 2 +- src/parser.ts | 38 +- src/typedjson/deserializer.ts | 2 +- src/typedjson/metadata.ts | 2 +- 8 files changed, 42 insertions(+), 1936 deletions(-) diff --git a/js/parser.d.ts b/js/parser.d.ts index c480ce3..6a1d9d4 100644 --- a/js/parser.d.ts +++ b/js/parser.d.ts @@ -11,7 +11,7 @@ export interface ITypedJSONSettings extends OptionsBase { * Re-throwing errors in this function will halt serialization/deserialization. * The default behavior is to log errors to the console. */ - errorHandler?: (e: Error) => void; + errorHandler?: ((e: Error) => void) | null; /** * Sets a callback that determines the constructor of the correct sub-type of polymorphic * objects while deserializing. @@ -19,21 +19,21 @@ export interface ITypedJSONSettings extends OptionsBase { * and look it up in 'knownTypes'. * The constructor of the sub-type should be returned. */ - typeResolver?: TypeResolver; - nameResolver?: (ctor: Function) => string; + typeResolver?: TypeResolver | null; + nameResolver?: ((ctor: Function) => string) | null; /** * Sets a callback that writes type-hints to serialized objects. * The default behavior is to write the type-name to the '__type' property, if a derived type * is present in place of a base type. */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** * Sets the amount of indentation to use in produced JSON strings. * Default value is 0, or no indentation. */ - indent?: number; - replacer?: (key: string, value: any) => any; - knownTypes?: Array>; + indent?: number | null; + replacer?: ((key: string, value: any) => any) | null; + knownTypes?: Array> | null; } export declare class TypedJSON { private static _globalConfig; diff --git a/js/typedjson.js b/js/typedjson.js index 2329d34..6a61a6d 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,1904 +1,10 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-27 - (function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define("typedjson", [], factory); - else if(typeof exports === 'object') - exports["typedjson"] = factory(); - else - root["typedjson"] = factory(); -})((typeof self !== 'undefined' ? self : this), function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); - -// CONCATENATED MODULE: ./src/typedjson/helpers.ts -var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -}; -var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' - + ' and "emitDecoratorMetadata" in your tsconfig.json?'; -/** - * Determines whether the specified type is a type that can be passed on "as-is" into - * `JSON.stringify`. - * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` - * for `number`). - */ -function isDirectlySerializableNativeType(type) { - return Boolean(~[Date, Number, String, Boolean].indexOf(type)); -} -function isDirectlyDeserializableNativeType(type) { - return Boolean(~[Number, String, Boolean].indexOf(type)); -} -function isTypeTypedArray(type) { - return Boolean(~[ - Float32Array, - Float64Array, - Int8Array, - Uint8Array, - Uint8ClampedArray, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - ].indexOf(type)); -} -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. - * @param B The supposed base type. - */ -function isSubtypeOf(A, B) { - return A === B || A.prototype instanceof B; -} -function logError(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.error === 'function') { - console.error.apply(console, __spreadArrays([message], optionalParams)); - } - else if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays(["ERROR: " + message], optionalParams)); - } -} -function logMessage(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays([message], optionalParams)); - } -} -function logWarning(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.warn === 'function') { - console.warn.apply(console, __spreadArrays([message], optionalParams)); - } - else if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays(["WARNING: " + message], optionalParams)); - } -} -/** - * Checks if the value is considered defined (not undefined and not null). - * @param value - */ -function isValueDefined(value) { - return !(typeof value === 'undefined' || value === null); -} -function isInstanceOf(value, constructor) { - if (typeof value === 'number') { - return constructor === Number; - } - else if (typeof value === 'string') { - return constructor === String; - } - else if (typeof value === 'boolean') { - return constructor === Boolean; - } - else if (isObject(value)) { - return value instanceof constructor; - } - return false; -} -var isReflectMetadataSupported = typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; -/** - * Gets the name of a function. - * @param fn The function whose name to get. - */ -function nameof(fn) { - if (typeof fn.name === 'string') { - return fn.name; - } - return 'undefined'; -} -function identity(arg) { - return arg; -} - -// CONCATENATED MODULE: ./src/typedjson/metadata.ts - -var METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; -var metadata_JsonObjectMetadata = /** @class */ (function () { - function JsonObjectMetadata(classType) { - this.dataMembers = new Map(); - /** Set of known types used for polymorphic deserialization */ - this.knownTypes = new Set(); - /** - * Indicates whether this class was explicitly annotated with @jsonObject - * or implicitly by @jsonMember - */ - this.isExplicitlyMarked = false; - /** - * Indicates whether this type is handled without annotation. This is usually - * used for the builtin types (except for Maps, Sets, and normal Arrays). - */ - this.isHandledWithoutAnnotation = false; - this.classType = classType; - } - /** - * Gets the name of a class as it appears in a serialized JSON string. - * @param ctor The constructor of a class (with or without jsonObject). - */ - JsonObjectMetadata.getJsonObjectName = function (ctor) { - var metadata = JsonObjectMetadata.getFromConstructor(ctor); - return metadata === undefined ? nameof(ctor) : nameof(metadata.classType); - }; - /** - * Gets jsonObject metadata information from a class. - * @param ctor The constructor class. - */ - JsonObjectMetadata.getFromConstructor = function (ctor) { - var prototype = ctor.prototype; - if (prototype == null) { - return; - } - var metadata; - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { - // The class prototype contains own jsonObject metadata - metadata = prototype[METADATA_FIELD_KEY]; - } - // Ignore implicitly added jsonObject (through jsonMember) - if ((metadata === null || metadata === void 0 ? void 0 : metadata.isExplicitlyMarked) === true) { - return metadata; - } - // In the end maybe it is something which we can handle directly - if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) { - var primitiveMeta = new JsonObjectMetadata(ctor); - primitiveMeta.isExplicitlyMarked = true; - // we do not store the metadata here to not modify builtin prototype - return primitiveMeta; - } - }; - JsonObjectMetadata.ensurePresentInPrototype = function (prototype) { - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { - return prototype[METADATA_FIELD_KEY]; - } - // Target has no JsonObjectMetadata associated with it yet, create it now. - var objectMetadata = new JsonObjectMetadata(prototype.constructor); - // Inherit json members and known types from parent @jsonObject (if any). - var parentMetadata = prototype[METADATA_FIELD_KEY]; - if (parentMetadata !== undefined) { - parentMetadata.dataMembers.forEach(function (memberMetadata, propKey) { - objectMetadata.dataMembers.set(propKey, memberMetadata); - }); - parentMetadata.knownTypes.forEach(function (knownType) { - objectMetadata.knownTypes.add(knownType); - }); - objectMetadata.typeResolver = parentMetadata.typeResolver; - objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; - } - Object.defineProperty(prototype, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata, - }); - return objectMetadata; - }; - /** - * Gets the known type name of a jsonObject class for type hint. - * @param constructor The constructor class. - */ - JsonObjectMetadata.getKnownTypeNameFromType = function (constructor) { - var metadata = JsonObjectMetadata.getFromConstructor(constructor); - return metadata === undefined ? nameof(constructor) : nameof(metadata.classType); - }; - JsonObjectMetadata.doesHandleWithoutAnnotation = function (ctor) { - return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) - || ctor === DataView || ctor === ArrayBuffer; - }; - return JsonObjectMetadata; -}()); - -function injectMetadataInformation(prototype, propKey, metadata) { - // For error messages - var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); - // When a property decorator is applied to a static member, 'constructor' is a constructor - // function. - // See: - // eslint-disable-next-line max-len - // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators - // ... and static members are not supported here, so abort. - if (typeof prototype === 'function') { - logError(decoratorName + ": cannot use a static property."); - return; - } - // Methods cannot be serialized. - // symbol indexing is not supported by ts - if (typeof prototype[propKey] === 'function') { - logError(decoratorName + ": cannot use a method property."); - return; - } - // @todo check if metadata is ever undefined, if so, change parameter type - if (metadata === undefined - || (metadata.type === undefined && metadata.deserializer === undefined)) { - logError(decoratorName + ": JsonMemberMetadata has unknown type."); - return; - } - // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). - // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked - // with '@jsonObject' as well. - var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); - if (metadata.deserializer === undefined) { - // If deserializer is not present then type must be - metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); - } - // clear metadata of undefined properties to save memory - Object.keys(metadata) - .forEach(function (key) { return (metadata[key] === undefined) && delete metadata[key]; }); - objectMetadata.dataMembers.set(metadata.name, metadata); -} - -// CONCATENATED MODULE: ./src/typedjson/options-base.ts -var __assign = (undefined && undefined.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var kAllOptions = [ - 'preserveNull', -]; -function extractOptionBase(from) { - var options = Object.keys(from) - .filter(function (key) { return kAllOptions.indexOf(key) > -1; }) - .reduce(function (obj, key) { - obj[key] = from[key]; - return obj; - }, {}); - return Object.keys(options).length > 0 ? options : undefined; -} -function getDefaultOptionOf(key) { - switch (key) { - case 'preserveNull': - return false; - } - // never reached - return null; -} -function getOptionValue(key, options) { - if ((options === null || options === void 0 ? void 0 : options[key]) !== undefined) { - return options[key]; - } - return getDefaultOptionOf(key); -} -function mergeOptions(existing, moreSpecific) { - return moreSpecific === undefined - ? existing - : __assign(__assign({}, existing), moreSpecific); -} - -// CONCATENATED MODULE: ./src/typedjson/type-descriptor.ts -var __extends = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var TypeDescriptor = /** @class */ (function () { - function TypeDescriptor(ctor) { - this.ctor = ctor; - } - TypeDescriptor.prototype.getTypes = function () { - return [this.ctor]; - }; - return TypeDescriptor; -}()); - -var ConcreteTypeDescriptor = /** @class */ (function (_super) { - __extends(ConcreteTypeDescriptor, _super); - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - function ConcreteTypeDescriptor(ctor) { - return _super.call(this, ctor) || this; - } - return ConcreteTypeDescriptor; -}(TypeDescriptor)); - -var GenericTypeDescriptor = /** @class */ (function (_super) { - __extends(GenericTypeDescriptor, _super); - function GenericTypeDescriptor(ctor) { - return _super.call(this, ctor) || this; - } - return GenericTypeDescriptor; -}(TypeDescriptor)); - -var ArrayTypeDescriptor = /** @class */ (function (_super) { - __extends(ArrayTypeDescriptor, _super); - function ArrayTypeDescriptor(elementType) { - var _this = _super.call(this, Array) || this; - _this.elementType = elementType; - return _this; - } - ArrayTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); - }; - return ArrayTypeDescriptor; -}(GenericTypeDescriptor)); - -function ArrayT(elementType) { - return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType)); -} -var SetTypeDescriptor = /** @class */ (function (_super) { - __extends(SetTypeDescriptor, _super); - function SetTypeDescriptor(elementType) { - var _this = _super.call(this, Set) || this; - _this.elementType = elementType; - return _this; - } - SetTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); - }; - return SetTypeDescriptor; -}(GenericTypeDescriptor)); - -function SetT(elementType) { - return new SetTypeDescriptor(ensureTypeDescriptor(elementType)); -} -var MapTypeDescriptor = /** @class */ (function (_super) { - __extends(MapTypeDescriptor, _super); - function MapTypeDescriptor(keyType, valueType, options) { - var _this = _super.call(this, Map) || this; - _this.keyType = keyType; - _this.valueType = valueType; - _this.options = options; - return _this; - } - MapTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.keyType.getTypes(), this.valueType.getTypes()); - }; - MapTypeDescriptor.prototype.getCompleteOptions = function () { - var _a, _b; - return { - shape: (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) !== null && _b !== void 0 ? _b : 0 /* ARRAY */, - }; - }; - return MapTypeDescriptor; -}(GenericTypeDescriptor)); - -function MapT(keyType, valueType, options) { - return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); -} -// TODO support for dictionary types ie. maps that are plain objects -// export class DictionaryTypeDescriptor extends GenericTypeDescriptor { -// constructor(public readonly elementType: TypeDescriptor) { -// super(Object); -// } -// -// getTypes(): Function[] { -// return super.getTypes().concat(this.elementType.getTypes()); -// } -// } -// -// export function DictT(elementType: Typelike): DictionaryTypeDescriptor { -// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); -// } -function isTypelike(type) { - return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); -} -function ensureTypeDescriptor(type) { - return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); -} - -// CONCATENATED MODULE: ./src/typedjson/deserializer.ts - - - - -function defaultTypeResolver(sourceObject, knownTypes) { - if (sourceObject.__type != null) { - return knownTypes.get(sourceObject.__type); - } -} -/** - * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. - * It is used after parsing a JSON-string. - */ -var deserializer_Deserializer = /** @class */ (function () { - function Deserializer() { - this.typeResolver = defaultTypeResolver; - this.errorHandler = logError; - this.deserializationStrategy = new Map([ - // primitives - [Number, deserializeDirectly], - [String, deserializeDirectly], - [Boolean, deserializeDirectly], - [Date, deserializeDate], - [ArrayBuffer, stringToArrayBuffer], - [DataView, stringToDataView], - [Array, convertAsArray], - [Set, convertAsSet], - [Map, convertAsMap], - // typed arrays - [Float32Array, convertAsFloatArray], - [Float64Array, convertAsFloatArray], - [Uint8Array, convertAsUintArray], - [Uint8ClampedArray, convertAsUintArray], - [Uint16Array, convertAsUintArray], - [Uint32Array, convertAsUintArray], - ]); - } - Deserializer.prototype.setNameResolver = function (nameResolverCallback) { - this.nameResolver = nameResolverCallback; - }; - Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { - if (typeof typeResolverCallback !== 'function') { - throw new TypeError('\'typeResolverCallback\' is not a function.'); - } - this.typeResolver = typeResolverCallback; - }; - Deserializer.prototype.getTypeResolver = function () { - return this.typeResolver; - }; - Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== 'function') { - throw new TypeError('\'errorHandlerCallback\' is not a function.'); - } - this.errorHandler = errorHandlerCallback; - }; - Deserializer.prototype.getErrorHandler = function () { - return this.errorHandler; - }; - Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - if (memberName === void 0) { memberName = 'object'; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - return null; - } - else if (!isValueDefined(sourceObject)) { - return; - } - var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer !== undefined) { - return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); - } - if (typeof sourceObject === 'object') { - return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); - } - this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); - }; - Deserializer.prototype.instantiateType = function (ctor) { - return new ctor(); - }; - Deserializer.prototype.mergeKnownTypes = function () { - var _this = this; - var knownTypeMaps = []; - for (var _i = 0; _i < arguments.length; _i++) { - knownTypeMaps[_i] = arguments[_i]; - } - var result = new Map(); - knownTypeMaps.forEach(function (knownTypes) { - knownTypes.forEach(function (ctor, name) { - if (_this.nameResolver === undefined) { - result.set(name, ctor); - } - else { - result.set(_this.nameResolver(ctor), ctor); - } - }); - }); - return result; - }; - Deserializer.prototype.createKnownTypesMap = function (knowTypes) { - var _this = this; - var map = new Map(); - knowTypes.forEach(function (ctor) { - if (_this.nameResolver === undefined) { - var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); - var name_1 = (knownTypeMeta === null || knownTypeMeta === void 0 ? void 0 : knownTypeMeta.isExplicitlyMarked) === true ? knownTypeMeta.name : null; - map.set(name_1 !== null && name_1 !== void 0 ? name_1 : ctor.name, ctor); - } - else { - map.set(_this.nameResolver(ctor), ctor); - } - }); - return map; - }; - Deserializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); - }; - return Deserializer; -}()); - -function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { - throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" - + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); -} -function makeTypeErrorMessage(expectedType, actualType, memberName) { - var expectedTypeName = typeof expectedType === 'function' - ? nameof(expectedType) - : expectedType; - var actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; - return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "'," - + (" got '" + actualTypeName + "'."); -} -function srcTypeNameForDebug(sourceObject) { - return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor); -} -function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { - if (sourceObject.constructor !== typeDescriptor.ctor) { - throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); - } - return sourceObject; -} -function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { - if (typeof sourceObject !== 'object' || sourceObject === null) { - deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); - return undefined; - } - var expectedSelfType = typeDescriptor.ctor; - var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); - var knownTypeConstructors = knownTypes; - var typeResolver = deserializer.getTypeResolver(); - if (sourceObjectMetadata !== undefined) { - // Merge known types received from "above" with known types defined on the current type. - knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); - if (sourceObjectMetadata.typeResolver !== undefined) { - typeResolver = sourceObjectMetadata.typeResolver; - } - } - // Check if a type-hint is available from the source object. - var typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint != null) { - // Check if type hint is a valid subtype of the expected source type. - if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { - // Hell yes. - expectedSelfType = typeFromTypeHint; - sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata !== undefined) { - // Also merge new known types from subtype. - knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); - } - } - } - if ((sourceObjectMetadata === null || sourceObjectMetadata === void 0 ? void 0 : sourceObjectMetadata.isExplicitlyMarked) === true) { - var sourceMetadata_1 = sourceObjectMetadata; - // Strong-typed deserialization available, get to it. - // First deserialize properties into a temporary object. - var sourceObjectWithDeserializedProperties_1 = {}; - var classOptions_1 = mergeOptions(deserializer.options, sourceMetadata_1.options); - // Deserialize by expected properties. - sourceMetadata_1.dataMembers.forEach(function (objMemberMetadata, propKey) { - var objMemberValue = sourceObject[propKey]; - var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var revivedValue; - if (objMemberMetadata.deserializer !== undefined) { - revivedValue = objMemberMetadata.deserializer(objMemberValue); - } - else if (objMemberMetadata.type === undefined) { - throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" - + " no constructor nor deserialization function to use."); - } - else { - revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); - } - // @todo revivedValue will never be null in RHS of || - if (isValueDefined(revivedValue) - || (deserializer.retrievePreserveNull(objMemberOptions) - && revivedValue === null)) { - sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; - } - else if (objMemberMetadata.isRequired === true) { - deserializer.getErrorHandler()(new TypeError("Missing required member '" + objMemberDebugName + "'.")); - } - }); - // Next, instantiate target object. - var targetObject = void 0; - if (typeof sourceObjectMetadata.initializerCallback === 'function') { - try { - targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); - // Check the validity of user-defined initializer callback. - if (targetObject === undefined) { - throw new TypeError("Cannot deserialize " + memberName + ":" - + " 'initializer' function returned undefined/null" - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); - } - else if (!(targetObject instanceof sourceObjectMetadata.classType)) { - throw new TypeError("Cannot deserialize " + memberName + ":" - + ("'initializer' returned '" + nameof(targetObject.constructor) + "'") - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected") - + (", and '" + nameof(targetObject.constructor) + "' is not a subtype of") - + (" '" + nameof(sourceObjectMetadata.classType) + "'")); - } - } - catch (e) { - deserializer.getErrorHandler()(e); - return undefined; - } - } - else { - targetObject = deserializer.instantiateType(expectedSelfType); - } - // Finally, assign deserialized properties to target object. - Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); - // Call onDeserialized method (if any). - var methodName = sourceObjectMetadata.onDeserializedMethodName; - if (methodName !== undefined) { - if (typeof targetObject[methodName] === 'function') { - // check for member first - targetObject[methodName](); - } - else if (typeof targetObject.constructor[methodName] === 'function') { - // check for static - targetObject.constructor[methodName](); - } - else { - deserializer.getErrorHandler()(new TypeError("onDeserialized callback" - + ("'" + nameof(sourceObjectMetadata.classType) + "." + methodName + "' is not a method."))); - } - } - return targetObject; - } - else { - // Untyped deserialization into Object instance. - var targetObject_1 = {}; - Object.keys(sourceObject).forEach(function (sourceKey) { - targetObject_1[sourceKey] = deserializer.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); - }); - return targetObject_1; - } -} -function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected," - + ' please use proper annotation or function for this type'); - } - if (!Array.isArray(sourceObject)) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return []; - } - if (typeDescriptor.elementType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of" - + " Array elements.")); - return []; - } - return sourceObject.map(function (element) { - // If an array element fails to deserialize, substitute with undefined. This is so that the - // original ordering is not interrupted by faulty - // entries, as an Array is ordered. - try { - return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); - } - catch (e) { - deserializer.getErrorHandler()(e); - // Keep filling the array here with undefined to keep original ordering. - // Note: this is just aesthetics, not returning anything produces the same result. - return undefined; - } - }); -} -function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected," - + " please use proper annotation or function for this type"); - } - if (!Array.isArray(sourceObject)) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return new Set(); - } - if (typeDescriptor.elementType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of" - + " Set elements.")); - return new Set(); - } - var resultSet = new Set(); - sourceObject.forEach(function (element, i) { - try { - resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); - } - catch (e) { - // Faulty entries are skipped, because a Set is not ordered, and skipping an entry - // does not affect others. - deserializer.getErrorHandler()(e); - } - }); - return resultSet; -} -function isExpectedMapShape(source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); -} -function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected," - + 'please use proper annotation or function for this type'); - } - var expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!isExpectedMapShape(sourceObject, expectedShape)) { - var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); - return new Map(); - } - if (typeDescriptor.keyType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); - return new Map(); - } - if (typeDescriptor.valueType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); - return new Map(); - } - var resultMap = new Map(); - if (expectedShape === 1 /* OBJECT */) { - Object.keys(sourceObject).forEach(function (key) { - try { - var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - if (isValueDefined(resultKey)) { - resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); - } - }); - } - else { - sourceObject.forEach(function (element) { - try { - var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) { - resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); - } - }); - } - return resultMap; -} -function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since - // the Epoch). - // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === 'string' - || (typeof sourceObject === 'number' && sourceObject > 0)) { - return new Date(sourceObject); - } - else if (sourceObject instanceof Date) { - return sourceObject; - } - else { - throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); - } -} -function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== 'string') { - throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); - } - return createArrayBufferFromString(sourceObject); -} -function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== 'string') { - throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); - } - return new DataView(createArrayBufferFromString(sourceObject)); -} -function createArrayBufferFromString(input) { - var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char - var bufView = new Uint16Array(buf); - for (var i = 0, strLen = input.length; i < strLen; i++) { - bufView[i] = input.charCodeAt(i); - } - return buf; -} -function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - return new constructor(sourceObject); - } - return throwTypeMismatchError(constructor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); -} -function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - return new constructor(sourceObject.map(function (value) { return ~~value; })); - } - return throwTypeMismatchError(typeDescriptor.ctor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); -} - -// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts - - - - -/** - * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' - * for 'Date[]'). - * @param options Additional options. - */ -function jsonArrayMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(elementConstructor)) { - logError(decoratorName + ": could not resolve constructor of array elements at runtime."); - return; - } - var dimensions = options.dimensions === undefined ? 1 : options.dimensions; - if (!isNaN(dimensions) && dimensions < 1) { - logError(decoratorName + ": 'dimensions' option must be at least 1."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been - // used on an array. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Array) { - logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} -function createArrayType(elementType, dimensions) { - var type = new ArrayTypeDescriptor(elementType); - for (var i = 1; i < dimensions; ++i) { - type = new ArrayTypeDescriptor(type); - } - return type; -} - -// CONCATENATED MODULE: ./src/typedjson/serializer.ts -var serializer_assign = (undefined && undefined.__assign) || function () { - serializer_assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return serializer_assign.apply(this, arguments); -}; - - - - -function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { - var _a; - // 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 will know what to deserialize into (given - // the required known-types are defined, and the object is a valid subtype of the expected - // type). - if (sourceObject.constructor !== expectedSourceType) { - targetObject.__type = (_a = sourceTypeMetadata === null || sourceTypeMetadata === void 0 ? void 0 : sourceTypeMetadata.name) !== null && _a !== void 0 ? _a : nameof(sourceObject.constructor); - } -} -/** - * 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 called "simple javascript object"), - * and emits any necessary type hints in the process (for polymorphism). - * - * 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: - * - * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string - */ -var serializer_Serializer = /** @class */ (function () { - function Serializer() { - this.typeHintEmitter = defaultTypeEmitter; - this.errorHandler = logError; - this.serializationStrategy = new Map([ - // primitives - [Date, identity], - [Number, identity], - [String, identity], - [Boolean, identity], - [ArrayBuffer, convertAsArrayBuffer], - [DataView, convertAsDataView], - [Array, serializer_convertAsArray], - [Set, serializer_convertAsSet], - [Map, serializer_convertAsMap], - // typed arrays - [Float32Array, convertAsTypedArray], - [Float64Array, convertAsTypedArray], - [Int8Array, convertAsTypedArray], - [Uint8Array, convertAsTypedArray], - [Uint8ClampedArray, convertAsTypedArray], - [Int16Array, convertAsTypedArray], - [Uint16Array, convertAsTypedArray], - [Int32Array, convertAsTypedArray], - [Uint32Array, convertAsTypedArray], - ]); - } - Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { - if (typeof typeEmitterCallback !== 'function') { - throw new TypeError('\'typeEmitterCallback\' is not a function.'); - } - this.typeHintEmitter = typeEmitterCallback; - }; - Serializer.prototype.getTypeHintEmitter = function () { - return this.typeHintEmitter; - }; - Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== 'function') { - throw new TypeError('\'errorHandlerCallback\' is not a function.'); - } - this.errorHandler = errorHandlerCallback; - }; - Serializer.prototype.getErrorHandler = function () { - return this.errorHandler; - }; - Serializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - /** - * Convert a value of any supported serializable type. - * The value type will be detected, and the correct serialization method will be called. - */ - Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { - if (memberName === void 0) { memberName = 'object'; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - return null; - } - if (!isValueDefined(sourceObject)) { - return; - } - if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { - var expectedName = nameof(typeDescriptor.ctor); - var actualName = nameof(sourceObject.constructor); - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "'," - + (" got '" + actualName + "'."))); - return; - } - var serializer = this.serializationStrategy.get(typeDescriptor.ctor); - if (serializer !== undefined) { - return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); - } - // if not present in the strategy do property by property serialization - if (typeof sourceObject === 'object') { - return serializer_convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); - } - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); - }; - return Serializer; -}()); - -/** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ -function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - var sourceTypeMetadata; - var targetObject; - var typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor - && sourceObject instanceof typeDescriptor.ctor) { - // The source object is not of the expected type, but it is a valid subtype. - // This is OK, and we'll proceed to gather object metadata from the subtype instead. - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else { - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); - } - if (sourceTypeMetadata === undefined) { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = serializer_assign({}, sourceObject); - } - else { - var beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; - if (beforeSerializationMethodName !== undefined) { - if (typeof sourceObject[beforeSerializationMethodName] === 'function') { - // check for member first - sourceObject[beforeSerializationMethodName](); - } - else if (typeof sourceObject.constructor[beforeSerializationMethodName] - === 'function') { - // check for static - sourceObject.constructor[beforeSerializationMethodName](); - } - else { - serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" - + (nameof(sourceTypeMetadata.classType) + "." + beforeSerializationMethodName) - + "' is not a method.")); - } - } - var sourceMeta_1 = sourceTypeMetadata; - // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including - // array/set/map members), and perform recursive conversion on each of them. The converted - // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' - // finally. - targetObject = {}; - var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); - if (sourceMeta_1.typeHintEmitter !== undefined) { - typeHintEmitter = sourceMeta_1.typeHintEmitter; - } - sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var serialized; - if (objMemberMetadata.serializer !== undefined) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } - else if (objMemberMetadata.type === undefined) { - throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" - + " no constructor nor serialization function to use."); - } - else { - serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); - } - if (isValueDefined(serialized) - // @todo check whether the or condition ever applies - // eslint-disable-next-line @typescript-eslint/tslint/config - || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)) { - targetObject[objMemberMetadata.name] = serialized; - } - }); - } - // Add type-hint. - typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - return targetObject; -} -/** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple - * javascript objects - * (or primitive values) for serialization. - */ -function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.elementType == null) { - throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); - } - // Check the type of each element, individually. - // If at least one array element type is incorrect, we return undefined, which results in no - // value emitted during serialization. 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 - // the emitted array. - sourceObject.forEach(function (element, i) { - if (!(serializer.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { - var expectedTypeName = nameof(typeDescriptor.elementType.ctor); - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - var actualTypeName = element && nameof(element.constructor); - throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" - + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); - } - }); - // @todo, is this necessary? - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - // Just for debugging purposes. - memberName += '[]'; - } - return sourceObject.map(function (element) { - return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - }); -} -/** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * @returns - */ -function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.elementType == null) { - throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); - } - // For debugging and error tracking. - // @todo, is this necessary? - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - memberName += '[]'; - } - var resultArray = []; - // Convert each element of the set, and put it into an output array. - // The output array is the one serialized, as JSON.stringify does not support Set serialization. - // (TODO: clarification needed) - sourceObject.forEach(function (element) { - var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became - // undefined - // DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) { - resultArray.push(resultElement); - } - }); - return resultArray; -} -/** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - */ -function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.valueType == null) { // @todo Check type - throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); - } - if (typeDescriptor.keyType == null) { // @todo Check type - throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); - } - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (memberName) { - memberName += '[]'; - } - // const resultArray: Array<{ key: any, value: any }> = []; - var resultShape = typeDescriptor.getCompleteOptions().shape; - var result = resultShape === 1 /* OBJECT */ ? {} : []; - var preserveNull = serializer.retrievePreserveNull(memberOptions); - // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach(function (value, key) { - var resultKeyValuePairObj = { - key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), - }; - // We are not going to emit entries with undefined keys OR undefined values. - var keyDefined = isValueDefined(resultKeyValuePairObj.key); - var valueDefined = isValueDefined(resultKeyValuePairObj.value) - // @todo check - // eslint-disable-next-line @typescript-eslint/tslint/config - || (resultKeyValuePairObj.value === null && preserveNull); - if (keyDefined && valueDefined) { - if (resultShape === 1 /* OBJECT */) { - result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; - } - else { - result.push(resultKeyValuePairObj); - } - } - }); - return result; -} -/** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - */ -function convertAsTypedArray(sourceObject) { - return Array.from(sourceObject); -} -/** - * Performs the conversion of a raw ArrayBuffer to a string. - */ -function convertAsArrayBuffer(buffer) { - // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)) - .map(function (charCode) { return String.fromCharCode(charCode); }).join(''); -} -/** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ -function convertAsDataView(dataView) { - return convertAsArrayBuffer(dataView.buffer); -} - -// CONCATENATED MODULE: ./src/parser.ts -var parser_assign = (undefined && undefined.__assign) || function () { - parser_assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return parser_assign.apply(this, arguments); -}; - - - - - - - - -var parser_TypedJSON = /** @class */ (function () { - /** - * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object - * instances of the specified root class type. - * @param rootConstructor The constructor of the root class type. - * @param settings Additional configuration settings. - */ - function TypedJSON(rootConstructor, settings) { - this.serializer = new serializer_Serializer(); - this.deserializer = new deserializer_Deserializer(); - this.globalKnownTypes = []; - this.indent = 0; - var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); - if (rootMetadata === undefined - || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { - throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); - } - this.nameResolver = function (ctor) { return nameof(ctor); }; - this.rootConstructor = rootConstructor; - this.errorHandler = function (error) { return logError(error); }; - if (settings !== undefined) { - this.config(settings); - } - else if (TypedJSON._globalConfig !== undefined) { - this.config({}); - } - } - TypedJSON.parse = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).parse(object); - }; - TypedJSON.parseAsArray = function (object, elementType, settings, dimensions) { - return new TypedJSON(elementType, settings).parseAsArray(object, dimensions); - }; - TypedJSON.parseAsSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).parseAsSet(object); - }; - TypedJSON.parseAsMap = function (object, keyType, valueType, settings) { - return new TypedJSON(valueType, settings).parseAsMap(object, keyType); - }; - TypedJSON.toPlainJson = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).toPlainJson(object); - }; - TypedJSON.toPlainArray = function (object, elementType, dimensions, settings) { - return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); - }; - TypedJSON.toPlainSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).toPlainSet(object); - }; - TypedJSON.toPlainMap = function (object, keyCtor, valueCtor, settings) { - return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); - }; - TypedJSON.stringify = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).stringify(object); - }; - TypedJSON.stringifyAsArray = function (object, elementType, dimensions, settings) { - return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); - }; - TypedJSON.stringifyAsSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).stringifyAsSet(object); - }; - TypedJSON.stringifyAsMap = function (object, keyCtor, valueCtor, settings) { - return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); - }; - TypedJSON.setGlobalConfig = function (config) { - if (this._globalConfig === undefined) { - this._globalConfig = config; - } - else { - Object.assign(this._globalConfig, config); - } - }; - /** - * Configures TypedJSON through a settings object. - * @param settings The configuration settings object. - */ - TypedJSON.prototype.config = function (settings) { - if (TypedJSON._globalConfig !== undefined) { - settings = parser_assign(parser_assign({}, TypedJSON._globalConfig), settings); - if (settings.knownTypes !== undefined - && TypedJSON._globalConfig.knownTypes !== undefined) { - // Merge known-types (also de-duplicate them, so Array -> Set -> Array). - settings.knownTypes = Array.from(new Set(settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes))); - } - } - var options = extractOptionBase(settings); - this.serializer.options = options; - this.deserializer.options = options; - if (settings.errorHandler !== undefined) { - this.errorHandler = settings.errorHandler; - this.deserializer.setErrorHandler(settings.errorHandler); - this.serializer.setErrorHandler(settings.errorHandler); - } - if (settings.replacer !== undefined) { - this.replacer = settings.replacer; - } - if (settings.typeResolver !== undefined) { - this.deserializer.setTypeResolver(settings.typeResolver); - } - if (settings.typeHintEmitter !== undefined) { - this.serializer.setTypeHintEmitter(settings.typeHintEmitter); - } - if (settings.indent !== undefined) { - this.indent = settings.indent; - } - if (settings.nameResolver !== undefined) { - this.nameResolver = settings.nameResolver; - this.deserializer.setNameResolver(settings.nameResolver); - // this.serializer.set - } - if (settings.knownTypes !== undefined) { - // Type-check knownTypes elements to recognize errors in advance. - settings.knownTypes.forEach(function (knownType, i) { - // tslint:disable-next-line:no-null-keyword - if (typeof knownType === 'undefined' || knownType === null) { - logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value" - + (" (element " + i + ").")); - } - }); - this.globalKnownTypes = settings.knownTypes; - } - }; - /** - * Converts a JSON string to the root class type. - * @param object The JSON to parse and convert. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns Deserialized T or undefined if there were errors. - */ - TypedJSON.prototype.parse = function (object) { - var _this = this; - var json = parseToJSObject(object, this.rootConstructor); - var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(this.rootConstructor); - var result; - var knownTypes = new Map(); - this.globalKnownTypes.filter(function (ktc) { return ktc; }).forEach(function (knownTypeCtor) { - knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - if (rootMetadata !== undefined) { - rootMetadata.knownTypes.forEach(function (knownTypeCtor) { - knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - } - try { - result = this.deserializer.convertSingleValue(json, ensureTypeDescriptor(this.rootConstructor), knownTypes); - } - catch (e) { - this.errorHandler(e); - } - return result; - }; - TypedJSON.prototype.parseAsArray = function (object, dimensions) { - if (dimensions === void 0) { dimensions = 1; } - var json = parseToJSObject(object, Array); - return this.deserializer.convertSingleValue(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); - }; - TypedJSON.prototype.parseAsSet = function (object) { - var json = parseToJSObject(object, Set); - return this.deserializer.convertSingleValue(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); - }; - TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { - var json = parseToJSObject(object, Map); - return this.deserializer.convertSingleValue(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); - }; - /** - * Converts an instance of the specified class type to a plain JSON object. - * @param object The instance to convert to a JSON string. - * @returns Serialized object or undefined if an error has occured. - */ - TypedJSON.prototype.toPlainJson = function (object) { - try { - return this.serializer.convertSingleValue(object, ensureTypeDescriptor(this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainArray = function (object, dimensions) { - if (dimensions === void 0) { dimensions = 1; } - try { - return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainSet = function (object) { - try { - return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainMap = function (object, keyConstructor) { - try { - return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - /** - * Converts an instance of the specified class type to a JSON string. - * @param object The instance to convert to a JSON string. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns String with the serialized object or an empty string if an error has occured, but - * the errorHandler did not throw. - */ - TypedJSON.prototype.stringify = function (object) { - var result = this.toPlainJson(object); - if (result === undefined) { - return ''; - } - return JSON.stringify(result, this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsArray = function (object, dimensions) { - return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsSet = function (object) { - return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsMap = function (object, keyConstructor) { - return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); - }; - TypedJSON.prototype._mapKnownTypes = function (constructors) { - var _this = this; - var map = new Map(); - constructors.filter(function (ctor) { return ctor; }).forEach(function (ctor) { return map.set(_this.nameResolver(ctor), ctor); }); - return map; - }; - return TypedJSON; -}()); - - -// CONCATENATED MODULE: ./src/typedjson/json-object.ts - - -function jsonObject(optionsOrTarget) { - var options; - if (typeof optionsOrTarget === 'function') { - // jsonObject is being used as a decorator, directly. - options = {}; - } - else { - // jsonObject is being used as a decorator factory. - options = optionsOrTarget !== null && optionsOrTarget !== void 0 ? optionsOrTarget : {}; - } - function decorator(target) { - // Create or obtain JsonObjectMetadata object. - var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(target.prototype); - // Fill JsonObjectMetadata. - objectMetadata.isExplicitlyMarked = true; - objectMetadata.onDeserializedMethodName = options.onDeserialized; - objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver !== undefined) { - objectMetadata.typeResolver = options.typeResolver; - } - if (options.typeHintEmitter !== undefined) { - objectMetadata.typeHintEmitter = options.typeHintEmitter; - } - // T extend Object so it is fine - objectMetadata.initializerCallback = options.initializer; - if (options.name !== undefined) { - objectMetadata.name = options.name; - } - var optionsBase = extractOptionBase(options); - if (optionsBase !== undefined) { - objectMetadata.options = optionsBase; - } - if (options.knownTypes !== undefined) { - options.knownTypes - .filter(function (knownType) { return Boolean(knownType); }) - .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); - } - } - if (typeof optionsOrTarget === 'function') { - // jsonObject is being used as a decorator, directly. - decorator(optionsOrTarget); - } - else { - // jsonObject is being used as a decorator factory. - return decorator; - } -} -function isSubClass(target) { - return; -} - -// CONCATENATED MODULE: ./src/typedjson/json-member.ts - - - - -function jsonMember(optionsOrPrototype, propKey) { - // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string - // The check is not required. - if (propKey !== undefined - && (typeof propKey === 'string' || typeof propKey === 'symbol')) { - var prototype = optionsOrPrototype; - // For error messages. - var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); - // jsonMember used directly, no additional information directly available besides target and - // propKey. - // Obtain property constructor through ReflectDecorators. - if (!isReflectMetadataSupported) { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is" - + " specified."); - return; - } - var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); - if (reflectPropCtor == null) { - logError(decoratorName + ": could not resolve detected property constructor at runtime." + MISSING_REFLECT_CONF_MSG); - return; - } - var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); - if (isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(prototype, propKey, { - type: typeDescriptor, - key: propKey.toString(), - name: propKey.toString(), - }); - } - else { - // jsonMember used as a decorator factory. - return function (target, _propKey) { - var _a, _b; - var options = (_a = optionsOrPrototype) !== null && _a !== void 0 ? _a : {}; - var typeDescriptor; - var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); - if (options.hasOwnProperty('constructor')) { - if (!isValueDefined(options.constructor)) { - logError(decoratorName + ": cannot resolve specified property constructor at" - + ' runtime.'); - return; - } - // Property constructor has been specified. Use ReflectDecorators (if available) to - // check whether that constructor is correct. Warn if not. - typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { - logWarning(decoratorName + ": detected property type does not match" - + " 'constructor' option."); - } - } - else { - // Use ReflectDecorators to obtain property constructor. - if (isReflectMetadataSupported) { - var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); - if (reflectCtor == null) { - logError(decoratorName + ": cannot resolve detected property constructor at" - + " runtime."); - return; - } - typeDescriptor = ensureTypeDescriptor(reflectCtor); - } - else if (options.deserializer === undefined) { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option" - + " is specified."); - return; - } - } - if (typeDescriptor !== undefined - && isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(target, _propKey, { - type: typeDescriptor, - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: _propKey.toString(), - name: (_b = options.name) !== null && _b !== void 0 ? _b : _propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; - } -} -function isSpecialPropertyType(decoratorName, typeDescriptor) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { - logError(decoratorName + ": property is an Array. Use the jsonArrayMember decorator to" - + " serialize this property."); - return true; - } - if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { - logError(decoratorName + ": property is a Set. Use the jsonSetMember decorator to" - + " serialize this property."); - return true; - } - if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { - logError(decoratorName + ": property is a Map. Use the jsonMapMember decorator to" - + " serialize this property."); - return true; - } - return false; -} - -// CONCATENATED MODULE: ./src/typedjson/json-set-member.ts - - - - -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' - * for Set). - * @param options Additional options. - */ -function jsonSetMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - // For error messages - var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(elementConstructor)) { - logError(decoratorName + ": could not resolve constructor of set elements at runtime."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used - // on a set. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Set) { - logError(decoratorName + ": property is not a Set. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: SetT(elementConstructor), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} - -// CONCATENATED MODULE: ./src/typedjson/json-map-member.ts - - - - -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Map. - * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map'). - * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). - * @param options Additional options. - */ -function jsonMapMember(keyConstructor, valueConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - // For error messages - var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(keyConstructor)) { - logError(decoratorName + ": could not resolve constructor of map keys at runtime."); - return; - } - if (!isTypelike(valueConstructor)) { - logError(decoratorName + ": could not resolve constructor of map values at runtime."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used - // on a map. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Map) { - logError(decoratorName + ": property is not a Map. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: MapT(keyConstructor, valueConstructor, { shape: options.shape }), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} - -// CONCATENATED MODULE: ./src/typedjson/to-json.ts - -function toJson(optionsOrTarget) { - if (typeof optionsOrTarget === 'function') { - // used directly - toJsonDecorator(optionsOrTarget, {}); - return; - } - // used as a factory - return function (target) { - toJsonDecorator(target, optionsOrTarget); - }; -} -function toJsonDecorator(target, options) { - if (options.overwrite !== true && target.prototype.toJSON !== undefined) { - throw new Error(target.name + " already has toJSON defined!"); - } - target.prototype.toJSON = function () { - return parser_TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor); - }; -} - -// CONCATENATED MODULE: ./src/typedjson.ts -/* concated harmony reexport TypedJSON */__webpack_require__.d(__webpack_exports__, "TypedJSON", function() { return parser_TypedJSON; }); -/* concated harmony reexport defaultTypeResolver */__webpack_require__.d(__webpack_exports__, "defaultTypeResolver", function() { return defaultTypeResolver; }); -/* concated harmony reexport defaultTypeEmitter */__webpack_require__.d(__webpack_exports__, "defaultTypeEmitter", function() { return defaultTypeEmitter; }); -/* concated harmony reexport JsonObjectMetadata */__webpack_require__.d(__webpack_exports__, "JsonObjectMetadata", function() { return metadata_JsonObjectMetadata; }); -/* concated harmony reexport jsonObject */__webpack_require__.d(__webpack_exports__, "jsonObject", function() { return jsonObject; }); -/* concated harmony reexport jsonMember */__webpack_require__.d(__webpack_exports__, "jsonMember", function() { return jsonMember; }); -/* concated harmony reexport jsonArrayMember */__webpack_require__.d(__webpack_exports__, "jsonArrayMember", function() { return jsonArrayMember; }); -/* concated harmony reexport jsonSetMember */__webpack_require__.d(__webpack_exports__, "jsonSetMember", function() { return jsonSetMember; }); -/* concated harmony reexport jsonMapMember */__webpack_require__.d(__webpack_exports__, "jsonMapMember", function() { return jsonMapMember; }); -/* concated harmony reexport toJson */__webpack_require__.d(__webpack_exports__, "toJson", function() { return toJson; }); -/* concated harmony reexport ArrayT */__webpack_require__.d(__webpack_exports__, "ArrayT", function() { return ArrayT; }); -/* concated harmony reexport SetT */__webpack_require__.d(__webpack_exports__, "SetT", function() { return SetT; }); -/* concated harmony reexport MapT */__webpack_require__.d(__webpack_exports__, "MapT", function() { return MapT; }); - - - - - - - - - - - -/***/ }) -/******/ ]); -}); -//# sourceMappingURL=typedjson.js.map \ No newline at end of file +export { TypedJSON, defaultTypeResolver, defaultTypeEmitter, } from './parser'; +export { JsonObjectMetadata } from './typedjson/metadata'; +export { jsonObject } from './typedjson/json-object'; +export { jsonMember } from './typedjson/json-member'; +export { jsonArrayMember } from './typedjson/json-array-member'; +export { jsonSetMember } from './typedjson/json-set-member'; +export { jsonMapMember } from './typedjson/json-map-member'; +export { toJson } from './typedjson/to-json'; +export { ArrayT, SetT, MapT } from './typedjson/type-descriptor'; +//# sourceMappingURL=typedjson.js.map \ No newline at end of file diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 365180c..23bc1d4 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return Boolean(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return Boolean(~[Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return Boolean(~[\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any));\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if (isValueDefined(serialized)\n // @todo check whether the or condition ever applies\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n // @todo check\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"typedjson.js","sourceRoot":"","sources":["../src/typedjson.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EAGT,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAgC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,6BAA6B,CAAC"} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index a934246..4a9eb33 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-27 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 2\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.error === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console === 'object' && typeof console.warn === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console === 'object' && typeof console.log === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\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 if (typeof fn.name === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject !== 'object' || sourceObject === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if (isValueDefined(serialized)\n // @todo check whether the or condition ever applies\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n // Just for debugging purposes.\n memberName += '[]';\n }\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n // For debugging and error tracking.\n // @todo, is this necessary?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (memberName) {\n memberName += '[]';\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = isValueDefined(resultKeyValuePairObj.value)\n // @todo check\n // eslint-disable-next-line @typescript-eslint/tslint/config\n || (resultKeyValuePairObj.value === null && preserveNull);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function () {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","undefined","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","methodName","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","resultSet","i","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/parser.ts b/src/parser.ts index aaaeacc..68655bc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -16,7 +16,7 @@ export interface ITypedJSONSettings extends OptionsBase { * Re-throwing errors in this function will halt serialization/deserialization. * The default behavior is to log errors to the console. */ - errorHandler?: (e: Error) => void; + errorHandler?: ((e: Error) => void) | null; /** * Sets a callback that determines the constructor of the correct sub-type of polymorphic @@ -25,31 +25,31 @@ export interface ITypedJSONSettings extends OptionsBase { * and look it up in 'knownTypes'. * The constructor of the sub-type should be returned. */ - typeResolver?: TypeResolver; + typeResolver?: TypeResolver | null; - nameResolver?: (ctor: Function) => string; + nameResolver?: ((ctor: Function) => string) | null; /** * Sets a callback that writes type-hints to serialized objects. * The default behavior is to write the type-name to the '__type' property, if a derived type * is present in place of a base type. */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** * Sets the amount of indentation to use in produced JSON strings. * Default value is 0, or no indentation. */ - indent?: number; + indent?: number | null; - replacer?: (key: string, value: any) => any; + replacer?: ((key: string, value: any) => any) | null; - knownTypes?: Array>; + knownTypes?: Array> | null; } export class TypedJSON { - private static _globalConfig: ITypedJSONSettings | undefined; + private static _globalConfig: ITypedJSONSettings | null | undefined; private serializer: Serializer = new Serializer(); private deserializer: Deserializer = new Deserializer(); @@ -290,7 +290,7 @@ export class TypedJSON { } static setGlobalConfig(config: ITypedJSONSettings) { - if (this._globalConfig === undefined) { + if (this._globalConfig == null) { this._globalConfig = config; } else { Object.assign(this._globalConfig, config); @@ -302,14 +302,14 @@ export class TypedJSON { * @param settings The configuration settings object. */ config(settings: ITypedJSONSettings) { - if (TypedJSON._globalConfig !== undefined) { + if (TypedJSON._globalConfig != null) { settings = { ...TypedJSON._globalConfig, ...settings, }; - if (settings.knownTypes !== undefined - && TypedJSON._globalConfig.knownTypes !== undefined) { + if (settings.knownTypes != null + && TypedJSON._globalConfig.knownTypes != null) { // Merge known-types (also de-duplicate them, so Array -> Set -> Array). settings.knownTypes = Array.from(new Set( settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes), @@ -321,32 +321,32 @@ export class TypedJSON { this.serializer.options = options; this.deserializer.options = options; - if (settings.errorHandler !== undefined) { + if (settings.errorHandler != null) { this.errorHandler = settings.errorHandler; this.deserializer.setErrorHandler(settings.errorHandler); this.serializer.setErrorHandler(settings.errorHandler); } - if (settings.replacer !== undefined) { + if (settings.replacer != null) { this.replacer = settings.replacer; } - if (settings.typeResolver !== undefined) { + if (settings.typeResolver != null) { this.deserializer.setTypeResolver(settings.typeResolver); } - if (settings.typeHintEmitter !== undefined) { + if (settings.typeHintEmitter != null) { this.serializer.setTypeHintEmitter(settings.typeHintEmitter); } - if (settings.indent !== undefined) { + if (settings.indent != null) { this.indent = settings.indent; } - if (settings.nameResolver !== undefined) { + if (settings.nameResolver != null) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); // this.serializer.set } - if (settings.knownTypes !== undefined) { + if (settings.knownTypes != null) { // Type-check knownTypes elements to recognize errors in advance. settings.knownTypes.forEach((knownType: any, i) => { // tslint:disable-next-line:no-null-keyword diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index f85d748..b003b76 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -324,7 +324,7 @@ function convertAsObject( ); // Check the validity of user-defined initializer callback. - if (targetObject as any === undefined) { + if (targetObject as any == null) { throw new TypeError( `Cannot deserialize ${memberName}:` + ` 'initializer' function returned undefined/null` diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index 0e10a9e..ec850ac 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -195,7 +195,7 @@ export function injectMetadataInformation( } // @todo check if metadata is ever undefined, if so, change parameter type - if (metadata as any === undefined + if (metadata as any == null || (metadata.type === undefined && metadata.deserializer === undefined)) { logError(`${decoratorName}: JsonMemberMetadata has unknown type.`); return; From 360ea5f13941f28a52037fdfbee2f2ca35e48033 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:18:36 +0000 Subject: [PATCH 042/119] Rename name -> customName in createKnownTypesMap --- src/typedjson/deserializer.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index b003b76..ec69076 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -152,8 +152,10 @@ export class Deserializer { knowTypes.forEach(ctor => { if (this.nameResolver === undefined) { const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor); - const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null; - map.set(name ?? ctor.name, ctor); + const customName = knownTypeMeta?.isExplicitlyMarked === true + ? knownTypeMeta.name + : null; + map.set(customName ?? ctor.name, ctor); } else { map.set(this.nameResolver(ctor), ctor); } From 05750ef17876f59cbada6a537b065400f5e5746b Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:22:56 +0000 Subject: [PATCH 043/119] Remove unneeded comments in parser.ts --- src/parser.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 68655bc..c9e68d0 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -343,13 +343,11 @@ export class TypedJSON { if (settings.nameResolver != null) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); - // this.serializer.set } if (settings.knownTypes != null) { // Type-check knownTypes elements to recognize errors in advance. settings.knownTypes.forEach((knownType: any, i) => { - // tslint:disable-next-line:no-null-keyword if (typeof knownType === 'undefined' || knownType === null) { logWarning( `TypedJSON.config: 'knownTypes' contains an undefined/null value` From 128c077f14b1f67c8ee1e75df13a1d8087b84530 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 12:40:27 +0000 Subject: [PATCH 044/119] Make null checks even more defensive in getOptionValue --- src/typedjson/helpers.ts | 3 +++ src/typedjson/options-base.ts | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 6fb0ef0..3f32aed 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -92,6 +92,9 @@ export function logWarning(message?: any, ...optionalParams: Array) { } } +export type NotNull = T extends null ? never : T; +export type RequiredNoNull = {[P in keyof T]-?: NotNull}; + /** * Checks if the value is considered defined (not undefined and not null). * @param value diff --git a/src/typedjson/options-base.ts b/src/typedjson/options-base.ts index ed49089..92e986a 100644 --- a/src/typedjson/options-base.ts +++ b/src/typedjson/options-base.ts @@ -1,3 +1,5 @@ +import {RequiredNoNull} from './helpers'; + /** * This options cascade through the annotations. Options set * in the more specific place override the previous option. @@ -9,7 +11,7 @@ export interface OptionsBase { * will not emit nor store the property if its value is null. * Default: false. */ - preserveNull?: boolean; + preserveNull?: boolean | null; } const kAllOptions: Array = [ @@ -28,7 +30,9 @@ export function extractOptionBase( return Object.keys(options).length > 0 ? options : undefined; } -export function getDefaultOptionOf(key: K): Required[K] { +export function getDefaultOptionOf( + key: K, +): RequiredNoNull[K] { switch (key) { case 'preserveNull': return false; @@ -39,19 +43,20 @@ export function getDefaultOptionOf(key: K): Require export function getOptionValue( key: K, - options?: OptionsBase, -): Required[K] { - if (options?.[key] !== undefined) { + options?: OptionsBase | null, +): RequiredNoNull[K] { + if (options != null && options[key] as any != null) { return options[key]!; } + return getDefaultOptionOf(key); } export function mergeOptions( existing?: OptionsBase, - moreSpecific?: OptionsBase, + moreSpecific?: OptionsBase | null, ): OptionsBase | undefined { - return moreSpecific === undefined + return moreSpecific == null ? existing : { From 9fabbbfc8b89a7fcc5fdffaf8ce9a29d7e151c71 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 13:34:40 +0000 Subject: [PATCH 045/119] Add | null to all optional input properties This should protect people without strict null checking. --- js/typedjson.js | 1893 ++++++++++++++++++++++++++- js/typedjson.js.map | 2 +- js/typedjson.min.js | 2 +- js/typedjson.min.js.map | 2 +- js/typedjson/helpers.d.ts | 4 + js/typedjson/json-array-member.d.ts | 12 +- js/typedjson/json-map-member.d.ts | 10 +- js/typedjson/json-member.d.ts | 12 +- js/typedjson/json-object.d.ts | 14 +- js/typedjson/json-set-member.d.ts | 10 +- js/typedjson/metadata.d.ts | 26 +- js/typedjson/options-base.d.ts | 9 +- src/typedjson/deserializer.ts | 8 +- src/typedjson/json-array-member.ts | 14 +- src/typedjson/json-map-member.ts | 10 +- src/typedjson/json-member.ts | 12 +- src/typedjson/json-object.ts | 22 +- src/typedjson/json-set-member.ts | 10 +- src/typedjson/metadata.ts | 26 +- src/typedjson/serializer.ts | 8 +- 20 files changed, 1992 insertions(+), 114 deletions(-) diff --git a/js/typedjson.js b/js/typedjson.js index 6a61a6d..b3e0acd 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,10 +1,1883 @@ -export { TypedJSON, defaultTypeResolver, defaultTypeEmitter, } from './parser'; -export { JsonObjectMetadata } from './typedjson/metadata'; -export { jsonObject } from './typedjson/json-object'; -export { jsonMember } from './typedjson/json-member'; -export { jsonArrayMember } from './typedjson/json-array-member'; -export { jsonSetMember } from './typedjson/json-set-member'; -export { jsonMapMember } from './typedjson/json-map-member'; -export { toJson } from './typedjson/to-json'; -export { ArrayT, SetT, MapT } from './typedjson/type-descriptor'; -//# sourceMappingURL=typedjson.js.map \ No newline at end of file +// [typedjson] Version: 1.6.0-rc2 - 2020-08-28 + (function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("typedjson", [], factory); + else if(typeof exports === 'object') + exports["typedjson"] = factory(); + else + root["typedjson"] = factory(); +})((typeof self !== 'undefined' ? self : this), function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); + +// CONCATENATED MODULE: ./src/typedjson/helpers.ts +var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; +var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' + + ' and "emitDecoratorMetadata" in your tsconfig.json?'; +/** + * Determines whether the specified type is a type that can be passed on "as-is" into + * `JSON.stringify`. + * Values of these types don't need special conversion. + * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` + * for `number`). + */ +function isDirectlySerializableNativeType(type) { + return [Date, Number, String, Boolean].indexOf(type) !== -1; +} +function isDirectlyDeserializableNativeType(type) { + return [Number, String, Boolean].indexOf(type) !== -1; +} +function isTypeTypedArray(type) { + return [ + Float32Array, + Float64Array, + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + ].indexOf(type) !== -1; +} +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. + * @param B The supposed base type. + */ +function isSubtypeOf(A, B) { + return A === B || A.prototype instanceof B; +} +function logError(message) { + var optionalParams = []; + for (var _i = 1; _i < arguments.length; _i++) { + optionalParams[_i - 1] = arguments[_i]; + } + if (typeof console === 'object' && typeof console.error === 'function') { + console.error.apply(console, __spreadArrays([message], optionalParams)); + } + else if (typeof console === 'object' && typeof console.log === 'function') { + console.log.apply(console, __spreadArrays(["ERROR: " + message], optionalParams)); + } +} +function logMessage(message) { + var optionalParams = []; + for (var _i = 1; _i < arguments.length; _i++) { + optionalParams[_i - 1] = arguments[_i]; + } + if (typeof console === 'object' && typeof console.log === 'function') { + console.log.apply(console, __spreadArrays([message], optionalParams)); + } +} +function logWarning(message) { + var optionalParams = []; + for (var _i = 1; _i < arguments.length; _i++) { + optionalParams[_i - 1] = arguments[_i]; + } + if (typeof console === 'object' && typeof console.warn === 'function') { + console.warn.apply(console, __spreadArrays([message], optionalParams)); + } + else if (typeof console === 'object' && typeof console.log === 'function') { + console.log.apply(console, __spreadArrays(["WARNING: " + message], optionalParams)); + } +} +/** + * Checks if the value is considered defined (not undefined and not null). + * @param value + */ +function isValueDefined(value) { + return !(typeof value === 'undefined' || value === null); +} +function isInstanceOf(value, constructor) { + if (typeof value === 'number') { + return constructor === Number; + } + else if (typeof value === 'string') { + return constructor === String; + } + else if (typeof value === 'boolean') { + return constructor === Boolean; + } + else if (isObject(value)) { + return value instanceof constructor; + } + return false; +} +var isReflectMetadataSupported = typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; +/** + * Gets the name of a function. + * @param fn The function whose name to get. + */ +function nameof(fn) { + if (typeof fn.name === 'string') { + return fn.name; + } + return 'undefined'; +} +function identity(arg) { + return arg; +} + +// CONCATENATED MODULE: ./src/typedjson/metadata.ts + +var METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; +var metadata_JsonObjectMetadata = /** @class */ (function () { + function JsonObjectMetadata(classType) { + this.dataMembers = new Map(); + /** Set of known types used for polymorphic deserialization */ + this.knownTypes = new Set(); + /** + * Indicates whether this class was explicitly annotated with @jsonObject + * or implicitly by @jsonMember + */ + this.isExplicitlyMarked = false; + /** + * Indicates whether this type is handled without annotation. This is usually + * used for the builtin types (except for Maps, Sets, and normal Arrays). + */ + this.isHandledWithoutAnnotation = false; + this.classType = classType; + } + /** + * Gets the name of a class as it appears in a serialized JSON string. + * @param ctor The constructor of a class (with or without jsonObject). + */ + JsonObjectMetadata.getJsonObjectName = function (ctor) { + var metadata = JsonObjectMetadata.getFromConstructor(ctor); + return metadata === undefined ? nameof(ctor) : nameof(metadata.classType); + }; + /** + * Gets jsonObject metadata information from a class. + * @param ctor The constructor class. + */ + JsonObjectMetadata.getFromConstructor = function (ctor) { + var prototype = ctor.prototype; + if (prototype == null) { + return; + } + var metadata; + if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) { + // The class prototype contains own jsonObject metadata + metadata = prototype[METADATA_FIELD_KEY]; + } + // Ignore implicitly added jsonObject (through jsonMember) + if ((metadata === null || metadata === void 0 ? void 0 : metadata.isExplicitlyMarked) === true) { + return metadata; + } + // In the end maybe it is something which we can handle directly + if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) { + var primitiveMeta = new JsonObjectMetadata(ctor); + primitiveMeta.isExplicitlyMarked = true; + // we do not store the metadata here to not modify builtin prototype + return primitiveMeta; + } + }; + JsonObjectMetadata.ensurePresentInPrototype = function (prototype) { + if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { + return prototype[METADATA_FIELD_KEY]; + } + // Target has no JsonObjectMetadata associated with it yet, create it now. + var objectMetadata = new JsonObjectMetadata(prototype.constructor); + // Inherit json members and known types from parent @jsonObject (if any). + var parentMetadata = prototype[METADATA_FIELD_KEY]; + if (parentMetadata !== undefined) { + parentMetadata.dataMembers.forEach(function (memberMetadata, propKey) { + objectMetadata.dataMembers.set(propKey, memberMetadata); + }); + parentMetadata.knownTypes.forEach(function (knownType) { + objectMetadata.knownTypes.add(knownType); + }); + objectMetadata.typeResolver = parentMetadata.typeResolver; + objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; + } + Object.defineProperty(prototype, METADATA_FIELD_KEY, { + enumerable: false, + configurable: false, + writable: false, + value: objectMetadata, + }); + return objectMetadata; + }; + /** + * Gets the known type name of a jsonObject class for type hint. + * @param constructor The constructor class. + */ + JsonObjectMetadata.getKnownTypeNameFromType = function (constructor) { + var metadata = JsonObjectMetadata.getFromConstructor(constructor); + return metadata === undefined ? nameof(constructor) : nameof(metadata.classType); + }; + JsonObjectMetadata.doesHandleWithoutAnnotation = function (ctor) { + return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) + || ctor === DataView || ctor === ArrayBuffer; + }; + return JsonObjectMetadata; +}()); + +function injectMetadataInformation(prototype, propKey, metadata) { + // For error messages + var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); + // When a property decorator is applied to a static member, 'constructor' is a constructor + // function. + // See: + // eslint-disable-next-line max-len + // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators + // ... and static members are not supported here, so abort. + if (typeof prototype === 'function') { + logError(decoratorName + ": cannot use a static property."); + return; + } + // Methods cannot be serialized. + // symbol indexing is not supported by ts + if (typeof prototype[propKey] === 'function') { + logError(decoratorName + ": cannot use a method property."); + return; + } + // @todo check if metadata is ever undefined, if so, change parameter type + if (metadata == null + || (metadata.type === undefined && metadata.deserializer === undefined)) { + logError(decoratorName + ": JsonMemberMetadata has unknown type."); + return; + } + // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). + // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked + // with '@jsonObject' as well. + var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); + if (metadata.deserializer === undefined) { + // If deserializer is not present then type must be + metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); + } + // clear metadata of undefined properties to save memory + Object.keys(metadata) + .forEach(function (key) { return (metadata[key] === undefined) && delete metadata[key]; }); + objectMetadata.dataMembers.set(metadata.name, metadata); +} + +// CONCATENATED MODULE: ./src/typedjson/options-base.ts +var __assign = (undefined && undefined.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var kAllOptions = [ + 'preserveNull', +]; +function extractOptionBase(from) { + var options = Object.keys(from) + .filter(function (key) { return kAllOptions.indexOf(key) > -1; }) + .reduce(function (obj, key) { + obj[key] = from[key]; + return obj; + }, {}); + return Object.keys(options).length > 0 ? options : undefined; +} +function getDefaultOptionOf(key) { + switch (key) { + case 'preserveNull': + return false; + } + // never reached + return null; +} +function getOptionValue(key, options) { + if (options != null && options[key] != null) { + return options[key]; + } + return getDefaultOptionOf(key); +} +function mergeOptions(existing, moreSpecific) { + return moreSpecific == null + ? existing + : __assign(__assign({}, existing), moreSpecific); +} + +// CONCATENATED MODULE: ./src/typedjson/type-descriptor.ts +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var TypeDescriptor = /** @class */ (function () { + function TypeDescriptor(ctor) { + this.ctor = ctor; + } + TypeDescriptor.prototype.getTypes = function () { + return [this.ctor]; + }; + return TypeDescriptor; +}()); + +var ConcreteTypeDescriptor = /** @class */ (function (_super) { + __extends(ConcreteTypeDescriptor, _super); + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + function ConcreteTypeDescriptor(ctor) { + return _super.call(this, ctor) || this; + } + return ConcreteTypeDescriptor; +}(TypeDescriptor)); + +var GenericTypeDescriptor = /** @class */ (function (_super) { + __extends(GenericTypeDescriptor, _super); + function GenericTypeDescriptor(ctor) { + return _super.call(this, ctor) || this; + } + return GenericTypeDescriptor; +}(TypeDescriptor)); + +var ArrayTypeDescriptor = /** @class */ (function (_super) { + __extends(ArrayTypeDescriptor, _super); + function ArrayTypeDescriptor(elementType) { + var _this = _super.call(this, Array) || this; + _this.elementType = elementType; + return _this; + } + ArrayTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); + }; + return ArrayTypeDescriptor; +}(GenericTypeDescriptor)); + +function ArrayT(elementType) { + return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType)); +} +var SetTypeDescriptor = /** @class */ (function (_super) { + __extends(SetTypeDescriptor, _super); + function SetTypeDescriptor(elementType) { + var _this = _super.call(this, Set) || this; + _this.elementType = elementType; + return _this; + } + SetTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); + }; + return SetTypeDescriptor; +}(GenericTypeDescriptor)); + +function SetT(elementType) { + return new SetTypeDescriptor(ensureTypeDescriptor(elementType)); +} +var MapTypeDescriptor = /** @class */ (function (_super) { + __extends(MapTypeDescriptor, _super); + function MapTypeDescriptor(keyType, valueType, options) { + var _this = _super.call(this, Map) || this; + _this.keyType = keyType; + _this.valueType = valueType; + _this.options = options; + return _this; + } + MapTypeDescriptor.prototype.getTypes = function () { + return _super.prototype.getTypes.call(this).concat(this.keyType.getTypes(), this.valueType.getTypes()); + }; + MapTypeDescriptor.prototype.getCompleteOptions = function () { + var _a, _b; + return { + shape: (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) !== null && _b !== void 0 ? _b : 0 /* ARRAY */, + }; + }; + return MapTypeDescriptor; +}(GenericTypeDescriptor)); + +function MapT(keyType, valueType, options) { + return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); +} +// TODO support for dictionary types ie. maps that are plain objects +// export class DictionaryTypeDescriptor extends GenericTypeDescriptor { +// constructor(public readonly elementType: TypeDescriptor) { +// super(Object); +// } +// +// getTypes(): Function[] { +// return super.getTypes().concat(this.elementType.getTypes()); +// } +// } +// +// export function DictT(elementType: Typelike): DictionaryTypeDescriptor { +// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); +// } +function isTypelike(type) { + return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); +} +function ensureTypeDescriptor(type) { + return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); +} + +// CONCATENATED MODULE: ./src/typedjson/deserializer.ts + + + + +function defaultTypeResolver(sourceObject, knownTypes) { + if (sourceObject.__type != null) { + return knownTypes.get(sourceObject.__type); + } +} +/** + * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. + * It is used after parsing a JSON-string. + */ +var deserializer_Deserializer = /** @class */ (function () { + function Deserializer() { + this.typeResolver = defaultTypeResolver; + this.errorHandler = logError; + this.deserializationStrategy = new Map([ + // primitives + [Number, deserializeDirectly], + [String, deserializeDirectly], + [Boolean, deserializeDirectly], + [Date, deserializeDate], + [ArrayBuffer, stringToArrayBuffer], + [DataView, stringToDataView], + [Array, convertAsArray], + [Set, convertAsSet], + [Map, convertAsMap], + // typed arrays + [Float32Array, convertAsFloatArray], + [Float64Array, convertAsFloatArray], + [Uint8Array, convertAsUintArray], + [Uint8ClampedArray, convertAsUintArray], + [Uint16Array, convertAsUintArray], + [Uint32Array, convertAsUintArray], + ]); + } + Deserializer.prototype.setNameResolver = function (nameResolverCallback) { + this.nameResolver = nameResolverCallback; + }; + Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { + if (typeof typeResolverCallback !== 'function') { + throw new TypeError('\'typeResolverCallback\' is not a function.'); + } + this.typeResolver = typeResolverCallback; + }; + Deserializer.prototype.getTypeResolver = function () { + return this.typeResolver; + }; + Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); + } + this.errorHandler = errorHandlerCallback; + }; + Deserializer.prototype.getErrorHandler = function () { + return this.errorHandler; + }; + Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { + if (memberName === void 0) { memberName = 'object'; } + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { + return null; + } + else if (!isValueDefined(sourceObject)) { + return; + } + var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); + if (deserializer !== undefined) { + return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); + } + if (typeof sourceObject === 'object') { + return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); + } + this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); + }; + Deserializer.prototype.instantiateType = function (ctor) { + return new ctor(); + }; + Deserializer.prototype.mergeKnownTypes = function () { + var _this = this; + var knownTypeMaps = []; + for (var _i = 0; _i < arguments.length; _i++) { + knownTypeMaps[_i] = arguments[_i]; + } + var result = new Map(); + knownTypeMaps.forEach(function (knownTypes) { + knownTypes.forEach(function (ctor, name) { + if (_this.nameResolver === undefined) { + result.set(name, ctor); + } + else { + result.set(_this.nameResolver(ctor), ctor); + } + }); + }); + return result; + }; + Deserializer.prototype.createKnownTypesMap = function (knowTypes) { + var _this = this; + var map = new Map(); + knowTypes.forEach(function (ctor) { + if (_this.nameResolver === undefined) { + var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); + var customName = (knownTypeMeta === null || knownTypeMeta === void 0 ? void 0 : knownTypeMeta.isExplicitlyMarked) === true + ? knownTypeMeta.name + : null; + map.set(customName !== null && customName !== void 0 ? customName : ctor.name, ctor); + } + else { + map.set(_this.nameResolver(ctor), ctor); + } + }); + return map; + }; + Deserializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + }; + Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); + }; + return Deserializer; +}()); + +function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { + throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" + + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); +} +function makeTypeErrorMessage(expectedType, actualType, memberName) { + var expectedTypeName = typeof expectedType === 'function' + ? nameof(expectedType) + : expectedType; + var actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; + return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "'," + + (" got '" + actualTypeName + "'."); +} +function srcTypeNameForDebug(sourceObject) { + return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor); +} +function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { + if (sourceObject.constructor !== typeDescriptor.ctor) { + throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); + } + return sourceObject; +} +function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { + if (typeof sourceObject !== 'object' || sourceObject === null) { + deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); + return undefined; + } + var expectedSelfType = typeDescriptor.ctor; + var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); + var knownTypeConstructors = knownTypes; + var typeResolver = deserializer.getTypeResolver(); + if (sourceObjectMetadata !== undefined) { + // Merge known types received from "above" with known types defined on the current type. + knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); + if (sourceObjectMetadata.typeResolver != null) { + typeResolver = sourceObjectMetadata.typeResolver; + } + } + // Check if a type-hint is available from the source object. + var typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); + if (typeFromTypeHint != null) { + // Check if type hint is a valid subtype of the expected source type. + if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { + // Hell yes. + expectedSelfType = typeFromTypeHint; + sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); + if (sourceObjectMetadata !== undefined) { + // Also merge new known types from subtype. + knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); + } + } + } + if ((sourceObjectMetadata === null || sourceObjectMetadata === void 0 ? void 0 : sourceObjectMetadata.isExplicitlyMarked) === true) { + var sourceMetadata_1 = sourceObjectMetadata; + // Strong-typed deserialization available, get to it. + // First deserialize properties into a temporary object. + var sourceObjectWithDeserializedProperties_1 = {}; + var classOptions_1 = mergeOptions(deserializer.options, sourceMetadata_1.options); + // Deserialize by expected properties. + sourceMetadata_1.dataMembers.forEach(function (objMemberMetadata, propKey) { + var objMemberValue = sourceObject[propKey]; + var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; + var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); + var revivedValue; + if (objMemberMetadata.deserializer != null) { + revivedValue = objMemberMetadata.deserializer(objMemberValue); + } + else if (objMemberMetadata.type == null) { + throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" + + " no constructor nor deserialization function to use."); + } + else { + revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); + } + // @todo revivedValue will never be null in RHS of || + if (isValueDefined(revivedValue) + || (deserializer.retrievePreserveNull(objMemberOptions) + && revivedValue === null)) { + sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; + } + else if (objMemberMetadata.isRequired === true) { + deserializer.getErrorHandler()(new TypeError("Missing required member '" + objMemberDebugName + "'.")); + } + }); + // Next, instantiate target object. + var targetObject = void 0; + if (typeof sourceObjectMetadata.initializerCallback === 'function') { + try { + targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); + // Check the validity of user-defined initializer callback. + if (targetObject == null) { + throw new TypeError("Cannot deserialize " + memberName + ":" + + " 'initializer' function returned undefined/null" + + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); + } + else if (!(targetObject instanceof sourceObjectMetadata.classType)) { + throw new TypeError("Cannot deserialize " + memberName + ":" + + ("'initializer' returned '" + nameof(targetObject.constructor) + "'") + + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected") + + (", and '" + nameof(targetObject.constructor) + "' is not a subtype of") + + (" '" + nameof(sourceObjectMetadata.classType) + "'")); + } + } + catch (e) { + deserializer.getErrorHandler()(e); + return undefined; + } + } + else { + targetObject = deserializer.instantiateType(expectedSelfType); + } + // Finally, assign deserialized properties to target object. + Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); + // Call onDeserialized method (if any). + var methodName = sourceObjectMetadata.onDeserializedMethodName; + if (methodName != null) { + if (typeof targetObject[methodName] === 'function') { + // check for member first + targetObject[methodName](); + } + else if (typeof targetObject.constructor[methodName] === 'function') { + // check for static + targetObject.constructor[methodName](); + } + else { + deserializer.getErrorHandler()(new TypeError("onDeserialized callback" + + ("'" + nameof(sourceObjectMetadata.classType) + "." + methodName + "' is not a method."))); + } + } + return targetObject; + } + else { + // Untyped deserialization into Object instance. + var targetObject_1 = {}; + Object.keys(sourceObject).forEach(function (sourceKey) { + targetObject_1[sourceKey] = deserializer.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); + }); + return targetObject_1; + } +} +function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected," + + ' please use proper annotation or function for this type'); + } + if (!Array.isArray(sourceObject)) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return []; + } + if (typeDescriptor.elementType == null) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of" + + " Array elements.")); + return []; + } + return sourceObject.map(function (element) { + // If an array element fails to deserialize, substitute with undefined. This is so that the + // original ordering is not interrupted by faulty + // entries, as an Array is ordered. + try { + return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); + } + catch (e) { + deserializer.getErrorHandler()(e); + // Keep filling the array here with undefined to keep original ordering. + // Note: this is just aesthetics, not returning anything produces the same result. + return undefined; + } + }); +} +function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected," + + " please use proper annotation or function for this type"); + } + if (!Array.isArray(sourceObject)) { + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); + return new Set(); + } + if (typeDescriptor.elementType == null) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of" + + " Set elements.")); + return new Set(); + } + var resultSet = new Set(); + sourceObject.forEach(function (element, i) { + try { + resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); + } + catch (e) { + // Faulty entries are skipped, because a Set is not ordered, and skipping an entry + // does not affect others. + deserializer.getErrorHandler()(e); + } + }); + return resultSet; +} +function isExpectedMapShape(source, expectedShape) { + return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) + || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); +} +function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { + throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected," + + 'please use proper annotation or function for this type'); + } + var expectedShape = typeDescriptor.getCompleteOptions().shape; + if (!isExpectedMapShape(sourceObject, expectedShape)) { + var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; + deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); + return new Map(); + } + if (typeDescriptor.keyType == null) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); + return new Map(); + } + if (typeDescriptor.valueType == null) { + deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); + return new Map(); + } + var resultMap = new Map(); + if (expectedShape === 1 /* OBJECT */) { + Object.keys(sourceObject).forEach(function (key) { + try { + var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + if (isValueDefined(resultKey)) { + resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + else { + sourceObject.forEach(function (element) { + try { + var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + // Undefined/null keys not supported, skip if so. + if (isValueDefined(key)) { + resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); + } + } + catch (e) { + // Faulty entries are skipped, because a Map is not ordered, + // and skipping an entry does not affect others. + deserializer.getErrorHandler()(e); + } + }); + } + return resultMap; +} +function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { + // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since + // the Epoch). + // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime + if (typeof sourceObject === 'string' + || (typeof sourceObject === 'number' && sourceObject > 0)) { + return new Date(sourceObject); + } + else if (sourceObject instanceof Date) { + return sourceObject; + } + else { + throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); + } +} +function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + } + return createArrayBufferFromString(sourceObject); +} +function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { + if (typeof sourceObject !== 'string') { + throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); + } + return new DataView(createArrayBufferFromString(sourceObject)); +} +function createArrayBufferFromString(input) { + var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char + var bufView = new Uint16Array(buf); + for (var i = 0, strLen = input.length; i < strLen; i++) { + bufView[i] = input.charCodeAt(i); + } + return buf; +} +function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + return new constructor(sourceObject); + } + return throwTypeMismatchError(constructor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); +} +// @todo: investigate bitwise and types +function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { + var constructor = typeDescriptor.ctor; + if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { + // eslint-disable-next-line no-bitwise + return new constructor(sourceObject.map(function (value) { return ~~value; })); + } + return throwTypeMismatchError(typeDescriptor.ctor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); +} + +// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts + + + + +/** + * Specifies that a property, of type array, is part of an object when serializing. + * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * for 'Date[]'). + * @param options Additional options. + */ +function jsonArrayMember(elementConstructor, options) { + if (options === void 0) { options = {}; } + return function (target, propKey) { + var _a; + var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); + if (!isTypelike(elementConstructor)) { + logError(decoratorName + ": could not resolve constructor of array elements at runtime."); + return; + } + var dimensions = options.dimensions == null ? 1 : options.dimensions; + if (!isNaN(dimensions) && dimensions < 1) { + logError(decoratorName + ": 'dimensions' option must be at least 1."); + return; + } + // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been + // used on an array. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Array) { + logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); + return; + } + injectMetadataInformation(target, propKey, { + type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; +} +function createArrayType(elementType, dimensions) { + var type = new ArrayTypeDescriptor(elementType); + for (var i = 1; i < dimensions; ++i) { + type = new ArrayTypeDescriptor(type); + } + return type; +} + +// CONCATENATED MODULE: ./src/typedjson/serializer.ts +var serializer_assign = (undefined && undefined.__assign) || function () { + serializer_assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return serializer_assign.apply(this, arguments); +}; + + + + +function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { + var _a; + // 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 will know what to deserialize into (given + // the required known-types are defined, and the object is a valid subtype of the expected + // type). + if (sourceObject.constructor !== expectedSourceType) { + targetObject.__type = (_a = sourceTypeMetadata === null || sourceTypeMetadata === void 0 ? void 0 : sourceTypeMetadata.name) !== null && _a !== void 0 ? _a : nameof(sourceObject.constructor); + } +} +/** + * 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 called "simple javascript object"), + * and emits any necessary type hints in the process (for polymorphism). + * + * 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: + * + * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string + */ +var serializer_Serializer = /** @class */ (function () { + function Serializer() { + this.typeHintEmitter = defaultTypeEmitter; + this.errorHandler = logError; + this.serializationStrategy = new Map([ + // primitives + [Date, identity], + [Number, identity], + [String, identity], + [Boolean, identity], + [ArrayBuffer, convertAsArrayBuffer], + [DataView, convertAsDataView], + [Array, serializer_convertAsArray], + [Set, serializer_convertAsSet], + [Map, serializer_convertAsMap], + // typed arrays + [Float32Array, convertAsTypedArray], + [Float64Array, convertAsTypedArray], + [Int8Array, convertAsTypedArray], + [Uint8Array, convertAsTypedArray], + [Uint8ClampedArray, convertAsTypedArray], + [Int16Array, convertAsTypedArray], + [Uint16Array, convertAsTypedArray], + [Int32Array, convertAsTypedArray], + [Uint32Array, convertAsTypedArray], + ]); + } + Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { + if (typeof typeEmitterCallback !== 'function') { + throw new TypeError('\'typeEmitterCallback\' is not a function.'); + } + this.typeHintEmitter = typeEmitterCallback; + }; + Serializer.prototype.getTypeHintEmitter = function () { + return this.typeHintEmitter; + }; + Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { + if (typeof errorHandlerCallback !== 'function') { + throw new TypeError('\'errorHandlerCallback\' is not a function.'); + } + this.errorHandler = errorHandlerCallback; + }; + Serializer.prototype.getErrorHandler = function () { + return this.errorHandler; + }; + Serializer.prototype.retrievePreserveNull = function (memberOptions) { + return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); + }; + /** + * Convert a value of any supported serializable type. + * The value type will be detected, and the correct serialization method will be called. + */ + Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { + if (memberName === void 0) { memberName = 'object'; } + if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { + return null; + } + if (!isValueDefined(sourceObject)) { + return; + } + if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { + var expectedName = nameof(typeDescriptor.ctor); + var actualName = nameof(sourceObject.constructor); + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "'," + + (" got '" + actualName + "'."))); + return; + } + var serializer = this.serializationStrategy.get(typeDescriptor.ctor); + if (serializer !== undefined) { + return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); + } + // if not present in the strategy do property by property serialization + if (typeof sourceObject === 'object') { + return serializer_convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); + } + this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); + }; + return Serializer; +}()); + +/** + * Performs the conversion of a typed object (usually a class instance) to a simple + * javascript object for serialization. + */ +function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + var sourceTypeMetadata; + var targetObject; + var typeHintEmitter = serializer.getTypeHintEmitter(); + if (sourceObject.constructor !== typeDescriptor.ctor + && sourceObject instanceof typeDescriptor.ctor) { + // The source object is not of the expected type, but it is a valid subtype. + // This is OK, and we'll proceed to gather object metadata from the subtype instead. + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); + } + else { + sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); + } + if (sourceTypeMetadata === undefined) { + // Untyped serialization, "as-is", we'll just pass the object on. + // 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. + targetObject = serializer_assign({}, sourceObject); + } + else { + var beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; + if (beforeSerializationMethodName != null) { + if (typeof sourceObject[beforeSerializationMethodName] === 'function') { + // check for member first + sourceObject[beforeSerializationMethodName](); + } + else if (typeof sourceObject.constructor[beforeSerializationMethodName] + === 'function') { + // check for static + sourceObject.constructor[beforeSerializationMethodName](); + } + else { + serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" + + (nameof(sourceTypeMetadata.classType) + "." + beforeSerializationMethodName) + + "' is not a method.")); + } + } + var sourceMeta_1 = sourceTypeMetadata; + // Strong-typed serialization available. + // We'll serialize by members that have been marked with @jsonMember (including + // array/set/map members), and perform recursive conversion on each of them. The converted + // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' + // finally. + targetObject = {}; + var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); + if (sourceMeta_1.typeHintEmitter != null) { + typeHintEmitter = sourceMeta_1.typeHintEmitter; + } + sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { + var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); + var serialized; + if (objMemberMetadata.serializer != null) { + serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); + } + else if (objMemberMetadata.type == null) { + throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" + + " no constructor nor serialization function to use."); + } + else { + serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); + } + if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null) + || isValueDefined(serialized)) { + targetObject[objMemberMetadata.name] = serialized; + } + }); + } + // Add type-hint. + typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); + return targetObject; +} +/** + * Performs the conversion of an array of typed objects (or primitive values) to an array of simple + * javascript objects + * (or primitive values) for serialization. + */ +function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); + } + if (typeDescriptor.elementType == null) { + throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); + } + // Check the type of each element, individually. + // If at least one array element type is incorrect, we return undefined, which results in no + // value emitted during serialization. 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 + // the emitted array. + sourceObject.forEach(function (element, i) { + if (!(serializer.retrievePreserveNull(memberOptions) && element === null) + && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { + var expectedTypeName = nameof(typeDescriptor.elementType.ctor); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + var actualTypeName = element && nameof(element.constructor); + throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" + + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); + } + }); + return sourceObject.map(function (element) { + return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + }); +} +/** + * Performs the conversion of a set of typed objects (or primitive values) into an array + * of simple javascript objects. + * @returns + */ +function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof SetTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); + } + if (typeDescriptor.elementType == null) { + throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); + } + var resultArray = []; + // Convert each element of the set, and put it into an output array. + // The output array is the one serialized, as JSON.stringify does not support Set serialization. + // (TODO: clarification needed) + sourceObject.forEach(function (element) { + var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + // Add to output if the source element was undefined, OR the converted element is defined. + // This will add intentionally undefined values to output, but not values that became + // undefined + // DURING serializing (usually because of a type-error). + if (!isValueDefined(element) || isValueDefined(resultElement)) { + resultArray.push(resultElement); + } + }); + return resultArray; +} +/** + * Performs the conversion of a map of typed objects (or primitive values) into an array + * of simple javascript objects with `key` and `value` properties. + */ +function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { + if (!(typeDescriptor instanceof MapTypeDescriptor)) { + throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please" + + ' use proper annotation or function for this type'); + } + if (typeDescriptor.valueType == null) { // @todo Check type + throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); + } + if (typeDescriptor.keyType == null) { // @todo Check type + throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); + } + // const resultArray: Array<{ key: any, value: any }> = []; + var resultShape = typeDescriptor.getCompleteOptions().shape; + var result = resultShape === 1 /* OBJECT */ ? {} : []; + var preserveNull = serializer.retrievePreserveNull(memberOptions); + // Convert each *entry* in the map to a simple javascript object with key and value properties. + sourceObject.forEach(function (value, key) { + var resultKeyValuePairObj = { + key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), + value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + }; + // We are not going to emit entries with undefined keys OR undefined values. + var keyDefined = isValueDefined(resultKeyValuePairObj.key); + var valueDefined = (resultKeyValuePairObj.value === null && preserveNull) + || isValueDefined(resultKeyValuePairObj.value); + if (keyDefined && valueDefined) { + if (resultShape === 1 /* OBJECT */) { + result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; + } + else { + result.push(resultKeyValuePairObj); + } + } + }); + return result; +} +/** + * Performs the conversion of a typed javascript array to a simple untyped javascript array. + * This is needed because typed arrays are otherwise serialized as objects, so we'll end up + * with something like "{ 0: 0, 1: 1, ... }". + */ +function convertAsTypedArray(sourceObject) { + return Array.from(sourceObject); +} +/** + * Performs the conversion of a raw ArrayBuffer to a string. + */ +function convertAsArrayBuffer(buffer) { + // ArrayBuffer -> 16-bit character codes -> character array -> joined string. + return Array.from(new Uint16Array(buffer)) + .map(function (charCode) { return String.fromCharCode(charCode); }).join(''); +} +/** + * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and + * returning that string. + */ +function convertAsDataView(dataView) { + return convertAsArrayBuffer(dataView.buffer); +} + +// CONCATENATED MODULE: ./src/parser.ts +var parser_assign = (undefined && undefined.__assign) || function () { + parser_assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return parser_assign.apply(this, arguments); +}; + + + + + + + + +var parser_TypedJSON = /** @class */ (function () { + /** + * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object + * instances of the specified root class type. + * @param rootConstructor The constructor of the root class type. + * @param settings Additional configuration settings. + */ + function TypedJSON(rootConstructor, settings) { + this.serializer = new serializer_Serializer(); + this.deserializer = new deserializer_Deserializer(); + this.globalKnownTypes = []; + this.indent = 0; + var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); + if (rootMetadata === undefined + || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { + throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); + } + this.nameResolver = function (ctor) { return nameof(ctor); }; + this.rootConstructor = rootConstructor; + this.errorHandler = function (error) { return logError(error); }; + if (settings !== undefined) { + this.config(settings); + } + else if (TypedJSON._globalConfig !== undefined) { + this.config({}); + } + } + TypedJSON.parse = function (object, rootType, settings) { + return new TypedJSON(rootType, settings).parse(object); + }; + TypedJSON.parseAsArray = function (object, elementType, settings, dimensions) { + return new TypedJSON(elementType, settings).parseAsArray(object, dimensions); + }; + TypedJSON.parseAsSet = function (object, elementType, settings) { + return new TypedJSON(elementType, settings).parseAsSet(object); + }; + TypedJSON.parseAsMap = function (object, keyType, valueType, settings) { + return new TypedJSON(valueType, settings).parseAsMap(object, keyType); + }; + TypedJSON.toPlainJson = function (object, rootType, settings) { + return new TypedJSON(rootType, settings).toPlainJson(object); + }; + TypedJSON.toPlainArray = function (object, elementType, dimensions, settings) { + return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); + }; + TypedJSON.toPlainSet = function (object, elementType, settings) { + return new TypedJSON(elementType, settings).toPlainSet(object); + }; + TypedJSON.toPlainMap = function (object, keyCtor, valueCtor, settings) { + return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); + }; + TypedJSON.stringify = function (object, rootType, settings) { + return new TypedJSON(rootType, settings).stringify(object); + }; + TypedJSON.stringifyAsArray = function (object, elementType, dimensions, settings) { + return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); + }; + TypedJSON.stringifyAsSet = function (object, elementType, settings) { + return new TypedJSON(elementType, settings).stringifyAsSet(object); + }; + TypedJSON.stringifyAsMap = function (object, keyCtor, valueCtor, settings) { + return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); + }; + TypedJSON.setGlobalConfig = function (config) { + if (this._globalConfig == null) { + this._globalConfig = config; + } + else { + Object.assign(this._globalConfig, config); + } + }; + /** + * Configures TypedJSON through a settings object. + * @param settings The configuration settings object. + */ + TypedJSON.prototype.config = function (settings) { + if (TypedJSON._globalConfig != null) { + settings = parser_assign(parser_assign({}, TypedJSON._globalConfig), settings); + if (settings.knownTypes != null + && TypedJSON._globalConfig.knownTypes != null) { + // Merge known-types (also de-duplicate them, so Array -> Set -> Array). + settings.knownTypes = Array.from(new Set(settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes))); + } + } + var options = extractOptionBase(settings); + this.serializer.options = options; + this.deserializer.options = options; + if (settings.errorHandler != null) { + this.errorHandler = settings.errorHandler; + this.deserializer.setErrorHandler(settings.errorHandler); + this.serializer.setErrorHandler(settings.errorHandler); + } + if (settings.replacer != null) { + this.replacer = settings.replacer; + } + if (settings.typeResolver != null) { + this.deserializer.setTypeResolver(settings.typeResolver); + } + if (settings.typeHintEmitter != null) { + this.serializer.setTypeHintEmitter(settings.typeHintEmitter); + } + if (settings.indent != null) { + this.indent = settings.indent; + } + if (settings.nameResolver != null) { + this.nameResolver = settings.nameResolver; + this.deserializer.setNameResolver(settings.nameResolver); + } + if (settings.knownTypes != null) { + // Type-check knownTypes elements to recognize errors in advance. + settings.knownTypes.forEach(function (knownType, i) { + if (typeof knownType === 'undefined' || knownType === null) { + logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value" + + (" (element " + i + ").")); + } + }); + this.globalKnownTypes = settings.knownTypes; + } + }; + /** + * Converts a JSON string to the root class type. + * @param object The JSON to parse and convert. + * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). + * @returns Deserialized T or undefined if there were errors. + */ + TypedJSON.prototype.parse = function (object) { + var _this = this; + var json = parseToJSObject(object, this.rootConstructor); + var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(this.rootConstructor); + var result; + var knownTypes = new Map(); + this.globalKnownTypes.filter(function (ktc) { return ktc; }).forEach(function (knownTypeCtor) { + knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); + }); + if (rootMetadata !== undefined) { + rootMetadata.knownTypes.forEach(function (knownTypeCtor) { + knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); + }); + } + try { + result = this.deserializer.convertSingleValue(json, ensureTypeDescriptor(this.rootConstructor), knownTypes); + } + catch (e) { + this.errorHandler(e); + } + return result; + }; + TypedJSON.prototype.parseAsArray = function (object, dimensions) { + if (dimensions === void 0) { dimensions = 1; } + var json = parseToJSObject(object, Array); + return this.deserializer.convertSingleValue(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); + }; + TypedJSON.prototype.parseAsSet = function (object) { + var json = parseToJSObject(object, Set); + return this.deserializer.convertSingleValue(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); + }; + TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { + var json = parseToJSObject(object, Map); + return this.deserializer.convertSingleValue(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); + }; + /** + * Converts an instance of the specified class type to a plain JSON object. + * @param object The instance to convert to a JSON string. + * @returns Serialized object or undefined if an error has occured. + */ + TypedJSON.prototype.toPlainJson = function (object) { + try { + return this.serializer.convertSingleValue(object, ensureTypeDescriptor(this.rootConstructor)); + } + catch (e) { + this.errorHandler(e); + } + }; + TypedJSON.prototype.toPlainArray = function (object, dimensions) { + if (dimensions === void 0) { dimensions = 1; } + try { + return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); + } + catch (e) { + this.errorHandler(e); + } + }; + TypedJSON.prototype.toPlainSet = function (object) { + try { + return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); + } + catch (e) { + this.errorHandler(e); + } + }; + TypedJSON.prototype.toPlainMap = function (object, keyConstructor) { + try { + return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); + } + catch (e) { + this.errorHandler(e); + } + }; + /** + * Converts an instance of the specified class type to a JSON string. + * @param object The instance to convert to a JSON string. + * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). + * @returns String with the serialized object or an empty string if an error has occured, but + * the errorHandler did not throw. + */ + TypedJSON.prototype.stringify = function (object) { + var result = this.toPlainJson(object); + if (result === undefined) { + return ''; + } + return JSON.stringify(result, this.replacer, this.indent); + }; + TypedJSON.prototype.stringifyAsArray = function (object, dimensions) { + return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent); + }; + TypedJSON.prototype.stringifyAsSet = function (object) { + return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent); + }; + TypedJSON.prototype.stringifyAsMap = function (object, keyConstructor) { + return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); + }; + TypedJSON.prototype._mapKnownTypes = function (constructors) { + var _this = this; + var map = new Map(); + constructors.filter(function (ctor) { return ctor; }).forEach(function (ctor) { return map.set(_this.nameResolver(ctor), ctor); }); + return map; + }; + return TypedJSON; +}()); + + +// CONCATENATED MODULE: ./src/typedjson/json-object.ts + + +function jsonObject(optionsOrTarget) { + var options; + if (typeof optionsOrTarget === 'function') { + // jsonObject is being used as a decorator, directly. + options = {}; + } + else { + // jsonObject is being used as a decorator factory. + options = optionsOrTarget !== null && optionsOrTarget !== void 0 ? optionsOrTarget : {}; + } + function decorator(target) { + // Create or obtain JsonObjectMetadata object. + var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(target.prototype); + // Fill JsonObjectMetadata. + objectMetadata.isExplicitlyMarked = true; + objectMetadata.onDeserializedMethodName = options.onDeserialized; + objectMetadata.beforeSerializationMethodName = options.beforeSerialization; + if (options.typeResolver != null) { + objectMetadata.typeResolver = options.typeResolver; + } + if (options.typeHintEmitter != null) { + objectMetadata.typeHintEmitter = options.typeHintEmitter; + } + // T extend Object so it is fine + objectMetadata.initializerCallback = options.initializer; + if (options.name != null) { + objectMetadata.name = options.name; + } + var optionsBase = extractOptionBase(options); + if (optionsBase !== undefined) { + objectMetadata.options = optionsBase; + } + if (options.knownTypes != null) { + options.knownTypes + .filter(function (knownType) { return Boolean(knownType); }) + .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); + } + } + if (typeof optionsOrTarget === 'function') { + // jsonObject is being used as a decorator, directly. + decorator(optionsOrTarget); + } + else { + // jsonObject is being used as a decorator factory. + return decorator; + } +} +function isSubClass(target) { + return; +} + +// CONCATENATED MODULE: ./src/typedjson/json-member.ts + + + + +function jsonMember(optionsOrPrototype, propKey) { + // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string + // The check is not required. + if (propKey !== undefined + && (typeof propKey === 'string' || typeof propKey === 'symbol')) { + var prototype = optionsOrPrototype; + // For error messages. + var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); + // jsonMember used directly, no additional information directly available besides target and + // propKey. + // Obtain property constructor through ReflectDecorators. + if (!isReflectMetadataSupported) { + logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is" + + " specified."); + return; + } + var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); + if (reflectPropCtor == null) { + logError(decoratorName + ": could not resolve detected property constructor at runtime." + MISSING_REFLECT_CONF_MSG); + return; + } + var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); + if (isSpecialPropertyType(decoratorName, typeDescriptor)) { + return; + } + injectMetadataInformation(prototype, propKey, { + type: typeDescriptor, + key: propKey.toString(), + name: propKey.toString(), + }); + } + else { + // jsonMember used as a decorator factory. + return function (target, _propKey) { + var _a, _b; + var options = (_a = optionsOrPrototype) !== null && _a !== void 0 ? _a : {}; + var typeDescriptor; + var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); + if (options.hasOwnProperty('constructor')) { + if (!isValueDefined(options.constructor)) { + logError(decoratorName + ": cannot resolve specified property constructor at" + + ' runtime.'); + return; + } + // Property constructor has been specified. Use ReflectDecorators (if available) to + // check whether that constructor is correct. Warn if not. + typeDescriptor = ensureTypeDescriptor(options.constructor); + if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { + logWarning(decoratorName + ": detected property type does not match" + + " 'constructor' option."); + } + } + else if (isReflectMetadataSupported) { + var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); + if (reflectCtor == null) { + logError(decoratorName + ": cannot resolve detected property constructor at" + + " runtime."); + return; + } + typeDescriptor = ensureTypeDescriptor(reflectCtor); + } + else if (options.deserializer === undefined) { + logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option" + + " is specified."); + return; + } + if (typeDescriptor !== undefined + && isSpecialPropertyType(decoratorName, typeDescriptor)) { + return; + } + injectMetadataInformation(target, _propKey, { + type: typeDescriptor, + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: _propKey.toString(), + name: (_b = options.name) !== null && _b !== void 0 ? _b : _propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; + } +} +function isSpecialPropertyType(decoratorName, typeDescriptor) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { + logError(decoratorName + ": property is an Array. Use the jsonArrayMember decorator to" + + " serialize this property."); + return true; + } + if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { + logError(decoratorName + ": property is a Set. Use the jsonSetMember decorator to" + + " serialize this property."); + return true; + } + if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { + logError(decoratorName + ": property is a Map. Use the jsonMapMember decorator to" + + " serialize this property."); + return true; + } + return false; +} + +// CONCATENATED MODULE: ./src/typedjson/json-set-member.ts + + + + +/** + * Specifies that the property is part of the object when serializing. + * Use this decorator on properties of type Set. + * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' + * for Set). + * @param options Additional options. + */ +function jsonSetMember(elementConstructor, options) { + if (options === void 0) { options = {}; } + return function (target, propKey) { + var _a; + // For error messages + var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); + if (!isTypelike(elementConstructor)) { + logError(decoratorName + ": could not resolve constructor of set elements at runtime."); + return; + } + // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used + // on a set. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Set) { + logError(decoratorName + ": property is not a Set. " + MISSING_REFLECT_CONF_MSG); + return; + } + injectMetadataInformation(target, propKey, { + type: SetT(elementConstructor), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; +} + +// CONCATENATED MODULE: ./src/typedjson/json-map-member.ts + + + + +/** + * Specifies that the property is part of the object when serializing. + * Use this decorator on properties of type Map. + * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map'). + * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). + * @param options Additional options. + */ +function jsonMapMember(keyConstructor, valueConstructor, options) { + if (options === void 0) { options = {}; } + return function (target, propKey) { + var _a; + // For error messages + var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); + if (!isTypelike(keyConstructor)) { + logError(decoratorName + ": could not resolve constructor of map keys at runtime."); + return; + } + if (!isTypelike(valueConstructor)) { + logError(decoratorName + ": could not resolve constructor of map values at runtime."); + return; + } + // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used + // on a map. Warn if not. + if (isReflectMetadataSupported + && Reflect.getMetadata('design:type', target, propKey) !== Map) { + logError(decoratorName + ": property is not a Map. " + MISSING_REFLECT_CONF_MSG); + return; + } + injectMetadataInformation(target, propKey, { + type: MapT(keyConstructor, valueConstructor, { shape: options.shape }), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: propKey.toString(), + name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; +} + +// CONCATENATED MODULE: ./src/typedjson/to-json.ts + +function toJson(optionsOrTarget) { + if (typeof optionsOrTarget === 'function') { + // used directly + toJsonDecorator(optionsOrTarget, {}); + return; + } + // used as a factory + return function (target) { + toJsonDecorator(target, optionsOrTarget); + }; +} +function toJsonDecorator(target, options) { + if (options.overwrite !== true && target.prototype.toJSON !== undefined) { + throw new Error(target.name + " already has toJSON defined!"); + } + target.prototype.toJSON = function toJSON() { + return parser_TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor); + }; +} + +// CONCATENATED MODULE: ./src/typedjson.ts +/* concated harmony reexport TypedJSON */__webpack_require__.d(__webpack_exports__, "TypedJSON", function() { return parser_TypedJSON; }); +/* concated harmony reexport defaultTypeResolver */__webpack_require__.d(__webpack_exports__, "defaultTypeResolver", function() { return defaultTypeResolver; }); +/* concated harmony reexport defaultTypeEmitter */__webpack_require__.d(__webpack_exports__, "defaultTypeEmitter", function() { return defaultTypeEmitter; }); +/* concated harmony reexport JsonObjectMetadata */__webpack_require__.d(__webpack_exports__, "JsonObjectMetadata", function() { return metadata_JsonObjectMetadata; }); +/* concated harmony reexport jsonObject */__webpack_require__.d(__webpack_exports__, "jsonObject", function() { return jsonObject; }); +/* concated harmony reexport jsonMember */__webpack_require__.d(__webpack_exports__, "jsonMember", function() { return jsonMember; }); +/* concated harmony reexport jsonArrayMember */__webpack_require__.d(__webpack_exports__, "jsonArrayMember", function() { return jsonArrayMember; }); +/* concated harmony reexport jsonSetMember */__webpack_require__.d(__webpack_exports__, "jsonSetMember", function() { return jsonSetMember; }); +/* concated harmony reexport jsonMapMember */__webpack_require__.d(__webpack_exports__, "jsonMapMember", function() { return jsonMapMember; }); +/* concated harmony reexport toJson */__webpack_require__.d(__webpack_exports__, "toJson", function() { return toJson; }); +/* concated harmony reexport ArrayT */__webpack_require__.d(__webpack_exports__, "ArrayT", function() { return ArrayT; }); +/* concated harmony reexport SetT */__webpack_require__.d(__webpack_exports__, "SetT", function() { return SetT; }); +/* concated harmony reexport MapT */__webpack_require__.d(__webpack_exports__, "MapT", function() { return MapT; }); + + + + + + + + + + + +/***/ }) +/******/ ]); +}); +//# sourceMappingURL=typedjson.js.map \ No newline at end of file diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 23bc1d4..02d4edc 100644 --- a/js/typedjson.js.map +++ b/js/typedjson.js.map @@ -1 +1 @@ -{"version":3,"file":"typedjson.js","sourceRoot":"","sources":["../src/typedjson.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EAGT,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAgC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,6BAA6B,CAAC"} \ 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 4a9eb33..0b6fa0d 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ // [typedjson] Version: 1.6.0-rc2 - 2020-08-28 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 2\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\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 /** Type descriptor of the member. */\n type?: TypeDescriptor;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n options?: OptionsBase;\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 dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter;\n /** If present override the global function */\n typeResolver?: TypeResolver;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string;\n\n options?: OptionsBase;\n\n onDeserializedMethodName?: string;\n\n beforeSerializationMethodName?: string;\n\n initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any === undefined\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(key: K): Required[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase,\n): Required[K] {\n if (options?.[key] !== undefined) {\n return options[key]!;\n }\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase,\n): OptionsBase | undefined {\n return moreSpecific === undefined\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta?.isExplicitlyMarked === true ? knownTypeMeta.name : null;\n map.set(name ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver !== undefined) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer !== undefined) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any === undefined) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName !== undefined) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName !== undefined) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter !== undefined) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer !== undefined) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type === undefined) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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?: TypeResolver;\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?: TypeHintEmitter;\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 private static _globalConfig: ITypedJSONSettings | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig === undefined) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig !== undefined) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes !== undefined\n && TypedJSON._globalConfig.knownTypes !== undefined) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler !== undefined) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer !== undefined) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver !== undefined) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter !== undefined) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent !== undefined) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver !== undefined) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes !== undefined) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver;\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 of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: 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 * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver !== undefined) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter !== undefined) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name !== undefined) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes !== undefined) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor;\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\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 /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","undefined","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","methodName","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","customName","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","resultSet","i","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts index 981895a..23ad4e6 100644 --- a/js/typedjson/helpers.d.ts +++ b/js/typedjson/helpers.d.ts @@ -21,6 +21,10 @@ export declare function isSubtypeOf(A: Function, B: Function): boolean; export declare function logError(message?: any, ...optionalParams: Array): void; export declare function logMessage(message?: any, ...optionalParams: Array): void; export declare function logWarning(message?: any, ...optionalParams: Array): void; +export declare type NotNull = T extends null ? never : T; +export declare type RequiredNoNull = { + [P in keyof T]-?: NotNull; +}; /** * Checks if the value is considered defined (not undefined and not null). * @param value diff --git a/js/typedjson/json-array-member.d.ts b/js/typedjson/json-array-member.d.ts index 69a3b76..9f4be5d 100644 --- a/js/typedjson/json-array-member.d.ts +++ b/js/typedjson/json-array-member.d.ts @@ -2,20 +2,20 @@ import { OptionsBase } from './options-base'; import { ArrayTypeDescriptor, TypeDescriptor } from './type-descriptor'; export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, an empty array is emitted if the property is undefined/uninitialized. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */ - dimensions?: number; + dimensions?: number | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** * Specifies that a property, of type array, is part of an object when serializing. diff --git a/js/typedjson/json-map-member.d.ts b/js/typedjson/json-map-member.d.ts index e4ab267..4103522 100644 --- a/js/typedjson/json-map-member.d.ts +++ b/js/typedjson/json-map-member.d.ts @@ -2,18 +2,18 @@ import { OptionsBase } from './options-base'; import { MapOptions, TypeDescriptor } from './type-descriptor'; export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** * Specifies that the property is part of the object when serializing. diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts index 7ac5a7b..c111ec1 100644 --- a/js/typedjson/json-member.d.ts +++ b/js/typedjson/json-member.d.ts @@ -6,20 +6,20 @@ export interface IJsonMemberOptions extends OptionsBase { * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function | TypeDescriptor; + constructor?: Function | TypeDescriptor | null; /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted if the property is uninitialized/undefined. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name. */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** * Specifies that a property is part of the object when serializing, with additional options. diff --git a/js/typedjson/json-object.d.ts b/js/typedjson/json-object.d.ts index 1aedc17..747b595 100644 --- a/js/typedjson/json-object.d.ts +++ b/js/typedjson/json-object.d.ts @@ -6,31 +6,31 @@ export interface IJsonObjectOptionsBase extends OptionsBase { /** * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Array; + knownTypes?: Array | null; /** * A function that will emit a type hint on the resulting JSON. It will override the global * typeEmitter. */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** * A function that given a source object will resolve the type that should be instantiated. * It will override the global type resolver. */ - typeResolver?: TypeResolver; + typeResolver?: TypeResolver | null; /** * The name of a static or instance method to call when deserialization * of the object is completed. */ - onDeserialized?: string; + onDeserialized?: string | null; /** * The name of a static or instance method to call before the serialization * of the typed object is started. */ - beforeSerialization?: string; + beforeSerialization?: string | null; /** * The name used to differentiate between different polymorphic types. */ - name?: string; + name?: string | null; } export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase { /** @@ -48,7 +48,7 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase { * (2) rawSourceObject, a raw 'Object' instance representation of the current object in * the serialized JSON (i.e. without deserialized properties). */ - initializer?: InitializerCallback; + initializer?: InitializerCallback | null; } /** * Marks that a class with a parameterized constructor is serializable using TypedJSON, with diff --git a/js/typedjson/json-set-member.d.ts b/js/typedjson/json-set-member.d.ts index 82b4312..a6c164b 100644 --- a/js/typedjson/json-set-member.d.ts +++ b/js/typedjson/json-set-member.d.ts @@ -1,18 +1,18 @@ import { OptionsBase } from './options-base'; export interface IJsonSetMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** * Specifies that the property is part of the object when serializing. diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts index 43d9a94..e748e14 100644 --- a/js/typedjson/metadata.d.ts +++ b/js/typedjson/metadata.d.ts @@ -6,29 +6,29 @@ export declare type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** Member name as it appears in the serialized JSON. */ name: string; /** Property or field key of the json member. */ key: string; /** Type descriptor of the member. */ - type?: TypeDescriptor; + type?: TypeDescriptor | null; /** If set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; - options?: OptionsBase; + isRequired?: boolean | null; + options?: OptionsBase | null; /** Custom deserializer to use. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** Custom serializer to use. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } export declare class JsonObjectMetadata { dataMembers: Map; /** Set of known types used for polymorphic deserialization */ knownTypes: Set>; /** If present override the global function */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** If present override the global function */ - typeResolver?: TypeResolver; + typeResolver?: TypeResolver | null; /** Gets or sets the constructor function for the jsonObject. */ classType: Function; /** @@ -42,11 +42,11 @@ export declare class JsonObjectMetadata { */ isHandledWithoutAnnotation: boolean; /** Name used to encode polymorphic type */ - name?: string; - options?: OptionsBase; - onDeserializedMethodName?: string; - beforeSerializationMethodName?: string; - initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; + name?: string | null; + options?: OptionsBase | null; + onDeserializedMethodName?: string | null; + beforeSerializationMethodName?: string | null; + initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null; constructor(classType: Function); /** * Gets the name of a class as it appears in a serialized JSON string. diff --git a/js/typedjson/options-base.d.ts b/js/typedjson/options-base.d.ts index 159cf53..175fdcc 100644 --- a/js/typedjson/options-base.d.ts +++ b/js/typedjson/options-base.d.ts @@ -1,3 +1,4 @@ +import { RequiredNoNull } from './helpers'; /** * This options cascade through the annotations. Options set * in the more specific place override the previous option. @@ -9,11 +10,11 @@ export interface OptionsBase { * will not emit nor store the property if its value is null. * Default: false. */ - preserveNull?: boolean; + preserveNull?: boolean | null; } export declare function extractOptionBase(from: { [key: string]: any; } & OptionsBase): OptionsBase | undefined; -export declare function getDefaultOptionOf(key: K): Required[K]; -export declare function getOptionValue(key: K, options?: OptionsBase): Required[K]; -export declare function mergeOptions(existing?: OptionsBase, moreSpecific?: OptionsBase): OptionsBase | undefined; +export declare function getDefaultOptionOf(key: K): RequiredNoNull[K]; +export declare function getOptionValue(key: K, options?: OptionsBase | null): RequiredNoNull[K]; +export declare function mergeOptions(existing?: OptionsBase, moreSpecific?: OptionsBase | null): OptionsBase | undefined; diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index ec69076..89978ed 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -245,7 +245,7 @@ function convertAsObject( knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes), ); - if (sourceObjectMetadata.typeResolver !== undefined) { + if (sourceObjectMetadata.typeResolver != null) { typeResolver = sourceObjectMetadata.typeResolver; } } @@ -285,9 +285,9 @@ function convertAsObject( const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let revivedValue; - if (objMemberMetadata.deserializer !== undefined) { + if (objMemberMetadata.deserializer != null) { revivedValue = objMemberMetadata.deserializer(objMemberValue); - } else if (objMemberMetadata.type === undefined) { + } else if (objMemberMetadata.type == null) { throw new TypeError( `Cannot deserialize ${objMemberDebugName} there is` + ` no constructor nor deserialization function to use.`, @@ -354,7 +354,7 @@ function convertAsObject( // Call onDeserialized method (if any). const methodName = sourceObjectMetadata.onDeserializedMethodName; - if (methodName !== undefined) { + if (methodName != null) { if (typeof (targetObject as any)[methodName] === 'function') { // check for member first (targetObject as any)[methodName](); diff --git a/src/typedjson/json-array-member.ts b/src/typedjson/json-array-member.ts index d2202ec..5651af5 100644 --- a/src/typedjson/json-array-member.ts +++ b/src/typedjson/json-array-member.ts @@ -14,25 +14,25 @@ declare abstract class Reflect { export interface IJsonArrayMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, an empty array is emitted if the property is undefined/uninitialized. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */ - dimensions?: number; + dimensions?: number | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** @@ -56,7 +56,7 @@ export function jsonArrayMember( return; } - const dimensions = options.dimensions === undefined ? 1 : options.dimensions; + const dimensions = options.dimensions == null ? 1 : options.dimensions; if (!isNaN(dimensions) && dimensions < 1) { logError(`${decoratorName}: 'dimensions' option must be at least 1.`); return; diff --git a/src/typedjson/json-map-member.ts b/src/typedjson/json-map-member.ts index a117d39..2df1b6d 100644 --- a/src/typedjson/json-map-member.ts +++ b/src/typedjson/json-map-member.ts @@ -9,22 +9,22 @@ declare abstract class Reflect { export interface IJsonMapMemberOptions extends OptionsBase, Partial { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** diff --git a/src/typedjson/json-member.ts b/src/typedjson/json-member.ts index afbc089..dfd0799 100644 --- a/src/typedjson/json-member.ts +++ b/src/typedjson/json-member.ts @@ -27,25 +27,25 @@ export interface IJsonMemberOptions extends OptionsBase { * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function | TypeDescriptor; + constructor?: Function | TypeDescriptor | null; /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted if the property is uninitialized/undefined. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name. */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** diff --git a/src/typedjson/json-object.ts b/src/typedjson/json-object.ts index c294780..6f875d1 100644 --- a/src/typedjson/json-object.ts +++ b/src/typedjson/json-object.ts @@ -8,36 +8,36 @@ export interface IJsonObjectOptionsBase extends OptionsBase { /** * An array of known types to recognize when encountering type-hints. */ - knownTypes?: Array; + knownTypes?: Array | null; /** * A function that will emit a type hint on the resulting JSON. It will override the global * typeEmitter. */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** * A function that given a source object will resolve the type that should be instantiated. * It will override the global type resolver. */ - typeResolver?: TypeResolver; + typeResolver?: TypeResolver | null; /** * The name of a static or instance method to call when deserialization * of the object is completed. */ - onDeserialized?: string; + onDeserialized?: string | null; /** * The name of a static or instance method to call before the serialization * of the typed object is started. */ - beforeSerialization?: string; + beforeSerialization?: string | null; /** * The name used to differentiate between different polymorphic types. */ - name?: string; + name?: string | null; } export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase { @@ -57,7 +57,7 @@ export interface IJsonObjectOptions extends IJsonObjectOptionsBase { * (2) rawSourceObject, a raw 'Object' instance representation of the current object in * the serialized JSON (i.e. without deserialized properties). */ - initializer?: InitializerCallback; + initializer?: InitializerCallback | null; } /** @@ -105,16 +105,16 @@ export function jsonObject( objectMetadata.onDeserializedMethodName = options.onDeserialized; objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver !== undefined) { + if (options.typeResolver != null) { objectMetadata.typeResolver = options.typeResolver; } - if (options.typeHintEmitter !== undefined) { + if (options.typeHintEmitter != null) { objectMetadata.typeHintEmitter = options.typeHintEmitter; } // T extend Object so it is fine objectMetadata.initializerCallback = options.initializer as any; - if (options.name !== undefined) { + if (options.name != null) { objectMetadata.name = options.name; } const optionsBase = extractOptionBase(options); @@ -122,7 +122,7 @@ export function jsonObject( objectMetadata.options = optionsBase; } - if (options.knownTypes !== undefined) { + if (options.knownTypes != null) { options.knownTypes .filter(knownType => Boolean(knownType)) .forEach(knownType => objectMetadata.knownTypes.add(knownType)); diff --git a/src/typedjson/json-set-member.ts b/src/typedjson/json-set-member.ts index 2169fa4..df58afd 100644 --- a/src/typedjson/json-set-member.ts +++ b/src/typedjson/json-set-member.ts @@ -9,22 +9,22 @@ declare abstract class Reflect { export interface IJsonSetMemberOptions extends OptionsBase { /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string; + name?: string | null; /** * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } /** diff --git a/src/typedjson/metadata.ts b/src/typedjson/metadata.ts index ec850ac..6777ffc 100644 --- a/src/typedjson/metadata.ts +++ b/src/typedjson/metadata.ts @@ -19,7 +19,7 @@ export type TypeHintEmitter export interface JsonMemberMetadata { /** If set, a default value will be emitted for uninitialized members. */ - emitDefaultValue?: boolean; + emitDefaultValue?: boolean | null; /** Member name as it appears in the serialized JSON. */ name: string; @@ -28,18 +28,18 @@ export interface JsonMemberMetadata { key: string; /** Type descriptor of the member. */ - type?: TypeDescriptor; + type?: TypeDescriptor | null; /** If set, indicates that the member must be present when deserializing. */ - isRequired?: boolean; + isRequired?: boolean | null; - options?: OptionsBase; + options?: OptionsBase | null; /** Custom deserializer to use. */ - deserializer?: (json: any) => any; + deserializer?: ((json: any) => any) | null; /** Custom serializer to use. */ - serializer?: (value: any) => any; + serializer?: ((value: any) => any) | null; } export class JsonObjectMetadata { @@ -50,9 +50,9 @@ export class JsonObjectMetadata { knownTypes = new Set>(); /** If present override the global function */ - typeHintEmitter?: TypeHintEmitter; + typeHintEmitter?: TypeHintEmitter | null; /** If present override the global function */ - typeResolver?: TypeResolver; + typeResolver?: TypeResolver | null; /** Gets or sets the constructor function for the jsonObject. */ classType: Function; @@ -69,15 +69,15 @@ export class JsonObjectMetadata { isHandledWithoutAnnotation: boolean = false; /** Name used to encode polymorphic type */ - name?: string; + name?: string | null; - options?: OptionsBase; + options?: OptionsBase | null; - onDeserializedMethodName?: string; + onDeserializedMethodName?: string | null; - beforeSerializationMethodName?: string; + beforeSerializationMethodName?: string | null; - initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object; + initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null; constructor( classType: Function, diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 32eed68..710d5a7 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -193,7 +193,7 @@ function convertAsObject( targetObject = {...sourceObject}; } else { const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; - if (beforeSerializationMethodName !== undefined) { + if (beforeSerializationMethodName != null) { if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') { // check for member first (sourceObject as any)[beforeSerializationMethodName](); @@ -219,16 +219,16 @@ function convertAsObject( targetObject = {}; const classOptions = mergeOptions(serializer.options, sourceMeta.options); - if (sourceMeta.typeHintEmitter !== undefined) { + if (sourceMeta.typeHintEmitter != null) { typeHintEmitter = sourceMeta.typeHintEmitter; } sourceMeta.dataMembers.forEach((objMemberMetadata) => { const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let serialized; - if (objMemberMetadata.serializer !== undefined) { + if (objMemberMetadata.serializer != null) { serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } else if (objMemberMetadata.type === undefined) { + } else if (objMemberMetadata.type == null) { throw new TypeError( `Could not serialize ${objMemberMetadata.name}, there is` + ` no constructor nor serialization function to use.`, From b009edc500bd83fa9a2d4405b3d63679433977e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sun, 30 Aug 2020 22:29:21 +0200 Subject: [PATCH 046/119] Improve debug member names for collections --- js/typedjson.js | 31 +++++++++++++++++-------------- js/typedjson.js.map | 2 +- js/typedjson.min.js | 4 ++-- js/typedjson.min.js.map | 2 +- src/typedjson/deserializer.ts | 14 ++++++++------ src/typedjson/serializer.ts | 17 +++++++++-------- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/js/typedjson.js b/js/typedjson.js index b3e0acd..037ec9a 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -1,4 +1,4 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-28 +// [typedjson] Version: 1.6.0-rc2 - 2020-08-30 (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -810,12 +810,12 @@ function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, de + " Array elements.")); return []; } - return sourceObject.map(function (element) { + return sourceObject.map(function (element, i) { // If an array element fails to deserialize, substitute with undefined. This is so that the // original ordering is not interrupted by faulty // entries, as an Array is ordered. try { - return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[]", memberOptions); + return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions); } catch (e) { deserializer.getErrorHandler()(e); @@ -875,13 +875,15 @@ function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, dese deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); return new Map(); } + var keyMemberName = memberName + "[].key"; + var valueMemberName = memberName + "[].value"; var resultMap = new Map(); if (expectedShape === 1 /* OBJECT */) { Object.keys(sourceObject).forEach(function (key) { try { - var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, keyMemberName, memberOptions); if (isValueDefined(resultKey)) { - resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, memberName + "[" + resultKey + "]", memberOptions)); + resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, valueMemberName, memberOptions)); } } catch (e) { @@ -894,10 +896,10 @@ function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, dese else { sourceObject.forEach(function (element) { try { - var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, memberName, memberOptions); + var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, keyMemberName, memberOptions); // Undefined/null keys not supported, skip if so. if (isValueDefined(key)) { - resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, memberName + "[" + key + "]", memberOptions)); + resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, valueMemberName, memberOptions)); } } catch (e) { @@ -1233,8 +1235,8 @@ function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, ser + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); } }); - return sourceObject.map(function (element) { - return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); + return sourceObject.map(function (element, i) { + return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName + "[" + i + "]", memberOptions); }); } /** @@ -1250,6 +1252,7 @@ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, seria if (typeDescriptor.elementType == null) { throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); } + memberName += '[]'; var resultArray = []; // Convert each element of the set, and put it into an output array. // The output array is the one serialized, as JSON.stringify does not support Set serialization. @@ -1258,8 +1261,7 @@ function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, seria var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); // Add to output if the source element was undefined, OR the converted element is defined. // This will add intentionally undefined values to output, but not values that became - // undefined - // DURING serializing (usually because of a type-error). + // undefined DURING serializing (usually because of a type-error). if (!isValueDefined(element) || isValueDefined(resultElement)) { resultArray.push(resultElement); } @@ -1281,15 +1283,16 @@ function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, seria if (typeDescriptor.keyType == null) { // @todo Check type throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); } - // const resultArray: Array<{ key: any, value: any }> = []; + var keyMemberName = memberName + "[].key"; + var valueMemberName = memberName + "[].value"; var resultShape = typeDescriptor.getCompleteOptions().shape; var result = resultShape === 1 /* OBJECT */ ? {} : []; var preserveNull = serializer.retrievePreserveNull(memberOptions); // Convert each *entry* in the map to a simple javascript object with key and value properties. sourceObject.forEach(function (value, key) { var resultKeyValuePairObj = { - key: serializer.convertSingleValue(key, typeDescriptor.keyType, memberName, memberOptions), - value: serializer.convertSingleValue(value, typeDescriptor.valueType, memberName, memberOptions), + key: serializer.convertSingleValue(key, typeDescriptor.keyType, keyMemberName, memberOptions), + value: serializer.convertSingleValue(value, typeDescriptor.valueType, valueMemberName, memberOptions), }; // We are not going to emit entries with undefined keys OR undefined values. var keyDefined = isValueDefined(resultKeyValuePairObj.key); diff --git a/js/typedjson.js.map b/js/typedjson.js.map index 02d4edc..cc84176 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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map((element, i) => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map((element, i) => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n `${memberName}[${i}]`,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n memberName += '[]';\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach((element) => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n keyMemberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n valueMemberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 0b6fa0d..bdf3d5a 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-28 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 2\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map(element => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${resultKey}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n memberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n `${memberName}[${key}]`,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map(element => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach(element => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined\n // DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n // const resultArray: Array<{ key: any, value: any }> = [];\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n memberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n memberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","m","MISSING_REFLECT_CONF_MSG","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","String","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","Date","JSON","parse","isSubtypeOf","A","B","prototype","logError","message","console","error","optionalParams","log","logWarning","warn","isValueDefined","value","isInstanceOf","constructor","Number","Boolean","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","name","identity","arg","METADATA_FIELD_KEY","getJsonObjectName","ctor","metadata","JsonObjectMetadata","getFromConstructor","undefined","classType","hasOwnProperty","isExplicitlyMarked","doesHandleWithoutAnnotation","primitiveMeta","ensurePresentInPrototype","objectMetadata","parentMetadata","dataMembers","forEach","memberMetadata","propKey","set","knownTypes","knownType","add","typeResolver","typeHintEmitter","Object","defineProperty","enumerable","configurable","writable","getKnownTypeNameFromType","indexOf","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Map","Set","isHandledWithoutAnnotation","injectMetadataInformation","decoratorName","type","deserializer","getTypes","keys","key","kAllOptions","extractOptionBase","from","options","filter","reduce","obj","getOptionValue","getDefaultOptionOf","mergeOptions","existing","moreSpecific","TypeDescriptor","GenericTypeDescriptor","concat","elementType","Array","ArrayT","ArrayTypeDescriptor","ensureTypeDescriptor","SetT","SetTypeDescriptor","keyType","valueType","getCompleteOptions","shape","MapT","MapTypeDescriptor","isTypelike","ConcreteTypeDescriptor","defaultTypeResolver","sourceObject","__type","get","setNameResolver","nameResolverCallback","nameResolver","setTypeResolver","typeResolverCallback","TypeError","getTypeResolver","setErrorHandler","errorHandlerCallback","errorHandler","getErrorHandler","convertSingleValue","typeDescriptor","memberName","memberOptions","retrievePreserveNull","deserializationStrategy","expectedSelfType","sourceObjectMetadata","knownTypeConstructors","mergeKnownTypes","createKnownTypesMap","typeFromTypeHint","objMemberMetadata","revivedValue","objMemberValue","objMemberDebugName","objMemberOptions","isRequired","targetObject","initializerCallback","e","instantiateType","assign","methodName","onDeserializedMethodName","sourceKey","convertAsObject","result","knownTypeMaps","knowTypes","map","knownTypeMeta","customName","isExpectedMapShape","source","expectedShape","isArray","deserializeDirectly","deserializeDate","stringToArrayBuffer","stringToDataView","convertAsArray","convertAsSet","convertAsMap","convertAsFloatArray","convertAsUintArray","throwTypeMismatchError","targetType","expectedSourceType","actualSourceType","makeTypeErrorMessage","actualType","srcTypeNameForDebug","objectName","element","i","resultSet","keyMemberName","valueMemberName","resultMap","resultKey","createArrayBufferFromString","input","buf","bufView","strLen","charCodeAt","every","elem","isNaN","jsonArrayMember","elementConstructor","target","dimensions","createArrayType","emitDefaultValue","toString","serializer","defaultTypeEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","getTypeHintEmitter","serializationStrategy","beforeSerializationMethodName","serialized","expectedName","actualName","convertAsArrayBuffer","convertAsDataView","convertAsTypedArray","expectedTypeName","actualTypeName","resultArray","resultElement","push","resultShape","preserveNull","resultKeyValuePairObj","keyDefined","valueDefined","buffer","charCode","fromCharCode","join","dataView","object","rootType","settings","TypedJSON","parseAsArray","parseAsSet","parseAsMap","toPlainJson","toPlainArray","toPlainSet","toPlainMap","keyCtor","valueCtor","stringify","stringifyAsArray","stringifyAsSet","stringifyAsMap","setGlobalConfig","config","_globalConfig","replacer","indent","globalKnownTypes","rootConstructor","rootMetadata","ktc","knownTypeCtor","_mapKnownTypes","keyConstructor","constructors","jsonObject","optionsOrTarget","decorator","onDeserialized","beforeSerialization","initializer","optionsBase","jsonMember","optionsOrPrototype","_propKey","reflectCtor","isSpecialPropertyType","reflectPropCtor","jsonSetMember","jsonMapMember","valueConstructor","toJson","toJsonDecorator","overwrite","toJSON","Error","getPrototypeOf","c","d","getter","o","r","Symbol","toStringTag","t","mode","__esModule","ns","create","bind","n","property","call","p","s","moduleId","l","modules"],"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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map((element, i) => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map((element, i) => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n `${memberName}[${i}]`,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n memberName += '[]';\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach((element) => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n keyMemberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n valueMemberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index 89978ed..ea86e45 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -418,7 +418,7 @@ function convertAsArray( return []; } - return sourceObject.map(element => { + return sourceObject.map((element, i) => { // If an array element fails to deserialize, substitute with undefined. This is so that the // original ordering is not interrupted by faulty // entries, as an Array is ordered. @@ -427,7 +427,7 @@ function convertAsArray( element, typeDescriptor.elementType, knownTypes, - `${memberName}[]`, + `${memberName}[${i}]`, memberOptions, ); } catch (e) { @@ -536,6 +536,8 @@ function convertAsMap( return new Map(); } + const keyMemberName = `${memberName}[].key`; + const valueMemberName = `${memberName}[].value`; const resultMap = new Map(); if (expectedShape === MapShape.OBJECT) { @@ -545,7 +547,7 @@ function convertAsMap( key, typeDescriptor.keyType, knownTypes, - memberName, + keyMemberName, memberOptions, ); if (isValueDefined(resultKey)) { @@ -555,7 +557,7 @@ function convertAsMap( sourceObject[key], typeDescriptor.valueType, knownTypes, - `${memberName}[${resultKey}]`, + valueMemberName, memberOptions, ), ); @@ -573,7 +575,7 @@ function convertAsMap( element.key, typeDescriptor.keyType, knownTypes, - memberName, + keyMemberName, memberOptions, ); @@ -585,7 +587,7 @@ function convertAsMap( element.value, typeDescriptor.valueType, knownTypes, - `${memberName}[${key}]`, + valueMemberName, memberOptions, ), ); diff --git a/src/typedjson/serializer.ts b/src/typedjson/serializer.ts index 710d5a7..5f59864 100644 --- a/src/typedjson/serializer.ts +++ b/src/typedjson/serializer.ts @@ -297,11 +297,11 @@ function convertAsArray( } }); - return sourceObject.map(element => { + return sourceObject.map((element, i) => { return serializer.convertSingleValue( element, typeDescriptor.elementType, - memberName, + `${memberName}[${i}]`, memberOptions, ); }); @@ -331,12 +331,13 @@ function convertAsSet( ); } + memberName += '[]'; const resultArray: Array = []; // Convert each element of the set, and put it into an output array. // The output array is the one serialized, as JSON.stringify does not support Set serialization. // (TODO: clarification needed) - sourceObject.forEach(element => { + sourceObject.forEach((element) => { const resultElement = serializer.convertSingleValue( element, typeDescriptor.elementType, @@ -346,8 +347,7 @@ function convertAsSet( // Add to output if the source element was undefined, OR the converted element is defined. // This will add intentionally undefined values to output, but not values that became - // undefined - // DURING serializing (usually because of a type-error). + // undefined DURING serializing (usually because of a type-error). if (!isValueDefined(element) || isValueDefined(resultElement)) { resultArray.push(resultElement); } @@ -385,7 +385,8 @@ function convertAsMap( ); } - // const resultArray: Array<{ key: any, value: any }> = []; + const keyMemberName = `${memberName}[].key`; + const valueMemberName = `${memberName}[].value`; const resultShape = typeDescriptor.getCompleteOptions().shape; const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : []; const preserveNull = serializer.retrievePreserveNull(memberOptions); @@ -396,13 +397,13 @@ function convertAsMap( key: serializer.convertSingleValue( key, typeDescriptor.keyType, - memberName, + keyMemberName, memberOptions, ), value: serializer.convertSingleValue( value, typeDescriptor.valueType, - memberName, + valueMemberName, memberOptions, ), }; From 893eb1b8953f9443566feab0fa9aed450f83a0f9 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 30 Aug 2020 20:49:26 +0000 Subject: [PATCH 047/119] Run CI on pull request --- .github/workflows/nodejs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 8196d89..be63a69 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -1,6 +1,6 @@ name: Node CI -on: [push] +on: [pull_request, push] jobs: build: From acc5187ca64cfa7f0e787a1b243eebca6c3cdbd5 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 27 Aug 2020 23:07:34 +0000 Subject: [PATCH 048/119] Test handling of dates before epoch --- spec/base.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/base.spec.ts b/spec/base.spec.ts index b99c5ec..fddfbbd 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -8,6 +8,7 @@ describe('basic serialization of', () => { 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('-1543915254', Date)).toEqual(new Date(-1543915254)); expect(TypedJSON.parse('"1970-01-18T20:51:55.254Z"', Date)) .toEqual(new Date(1543915254)); @@ -23,6 +24,8 @@ describe('basic serialization of', () => { expect(TypedJSON.stringify(true, Boolean)).toEqual('true'); expect(TypedJSON.stringify(new Date(1543915254), Date)) .toEqual(`"${new Date(1543915254).toISOString()}"`); + expect(TypedJSON.stringify(new Date(-1543915254), Date)) + .toEqual(`"${new Date(-1543915254).toISOString()}"`); expect(TypedJSON.stringify(new Date('2018-12-04T09:20:54'), Date)) .toEqual(`"${new Date('2018-12-04T09:20:54').toISOString()}"`); From 7299139bc4903031e790247bbcca057075383220 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 00:06:25 +0000 Subject: [PATCH 049/119] Test shouldOmitParseString --- spec/helpers.spec.ts | 61 ++++++++++++++++++++++++++++++++++++++++ src/typedjson/helpers.ts | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 spec/helpers.spec.ts diff --git a/spec/helpers.spec.ts b/spec/helpers.spec.ts new file mode 100644 index 0000000..b8f5188 --- /dev/null +++ b/spec/helpers.spec.ts @@ -0,0 +1,61 @@ +import {shouldOmitParseString} from '../src/typedjson/helpers'; + +describe('helpers', () => { + describe('shouldOmitParseString', () => { + it('should handle plain numbers', () => { + expect(shouldOmitParseString('50', Number)).toEqual(false); + }); + it('should handle numbers with decimal places', () => { + expect(shouldOmitParseString('50.120', Number)).toEqual(false); + }); + it('should handle negative numbers', () => { + expect(shouldOmitParseString('-50', Number)).toEqual(false); + }); + it('should handle negative numbers with decimal places', () => { + expect(shouldOmitParseString('-50.120', Number)).toEqual(false); + }); + it('should handle numbers with a plus', () => { + expect(shouldOmitParseString('-50', Number)).toEqual(false); + }); + it('should handle negative numbers with a plus and decimal places', () => { + expect(shouldOmitParseString('+50.120', Number)).toEqual(false); + }); + it('should handle exponential notation', () => { + expect(shouldOmitParseString('1e2', Number)).toEqual(false); + }); + it('should handle exponential notation with decimal places', () => { + expect(shouldOmitParseString('1.120e2', Number)).toEqual(false); + }); + it('should handle negative exponential notation', () => { + expect(shouldOmitParseString('-1e2', Number)).toEqual(false); + }); + it('should handle negative exponential notation with decimal places', () => { + expect(shouldOmitParseString('-1.120e2', Number)).toEqual(false); + }); + it('should handle positive exponential notation', () => { + expect(shouldOmitParseString('+1e2', Number)).toEqual(false); + }); + it('should handle positive exponential notation with decimal places', () => { + expect(shouldOmitParseString('+1.120e2', Number)).toEqual(false); + }); + + it('should handle plain numeric dates', () => { + expect(shouldOmitParseString('50', Date)).toEqual(false); + }); + it('should handle negative dates', () => { + expect(shouldOmitParseString('-50', Date)).toEqual(false); + }); + it('should handle dates with a plus', () => { + expect(shouldOmitParseString('-50', Date)).toEqual(false); + }); + it('should handle dates in exponential notation', () => { + expect(shouldOmitParseString('1e2', Date)).toEqual(false); + }); + it('should handle dates in negative exponential notation', () => { + expect(shouldOmitParseString('-1e2', Date)).toEqual(false); + }); + it('should handle dates in positive exponential notation', () => { + expect(shouldOmitParseString('+1e2', Date)).toEqual(false); + }); + }); +}); diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 3f32aed..8023974 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -40,7 +40,7 @@ export function isObject(value: any): value is Object { return typeof value === 'object'; } -function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean { +export function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean { const expectsTypesSerializedAsStrings = expectedType === String || expectedType === ArrayBuffer || expectedType === DataView; From 2ebb3afa6b5f684336f20b842483ce5794906988 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 00:24:53 +0000 Subject: [PATCH 050/119] Fix shouldOmitParseString handling of numbers for dates --- src/typedjson/helpers.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index 8023974..ce627f6 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -48,10 +48,14 @@ export function shouldOmitParseString(jsonStr: string, expectedType: Function): const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length - 1] === '"'; - const isInteger = /^\d+$/.test(jsonStr.trim()); - return (expectsTypesSerializedAsStrings && !hasQuotes) - || ((!hasQuotes && !isInteger) && expectedType === Date); + if (expectedType === Date) { + // Date can both have strings and numbers as input + const isNumber = !isNaN(Number(jsonStr.trim())); + return !hasQuotes && !isNumber; + } + + return expectsTypesSerializedAsStrings && !hasQuotes; } export function parseToJSObject(json: any, expectedType: Serializable): Object { From 6c840595b9ebb26dd08e59869c74e5a8b517922f Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 28 Aug 2020 00:27:11 +0000 Subject: [PATCH 051/119] Fix negative timestamp and throw on non-integer --- src/typedjson/deserializer.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/typedjson/deserializer.ts b/src/typedjson/deserializer.ts index ea86e45..bf55edb 100644 --- a/src/typedjson/deserializer.ts +++ b/src/typedjson/deserializer.ts @@ -613,9 +613,18 @@ function deserializeDate( // the Epoch). // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === 'string' - || (typeof sourceObject === 'number' && sourceObject > 0)) { - return new Date(sourceObject as any); + if (typeof sourceObject === 'number') { + const isInteger = sourceObject % 1 === 0; + if (!isInteger) { + throw new TypeError( + `Could not deserialize ${memberName} as Date:` + + ` expected an integer, got a number with decimal places.`, + ); + } + + return new Date(sourceObject); + } else if (typeof sourceObject === 'string') { + return new Date(sourceObject); } else if (sourceObject instanceof Date) { return sourceObject; } else { From 6e98a01cb00d7182d7645a71743a547cf1fce638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Mon, 31 Aug 2020 21:27:51 +0200 Subject: [PATCH 052/119] Add library size limits --- .github/workflows/nodejs.yml | 10 +- package-lock.json | 10869 +++++++++++++++++++++------------ package.json | 11 +- 3 files changed, 6935 insertions(+), 3955 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index be63a69..2f193a1 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -17,11 +17,17 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - name: npm install, lint, build, and test + - name: npm install + run: npm ci + - uses: andresz1/size-limit-action@v1.4.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + skip_step: install + - name: npm lint, build, test, and size run: | - npm ci npm run lint npm run build --if-present npm test + npm run size env: CI: true diff --git a/package-lock.json b/package-lock.json index 4453f64..d9b8fc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -203,119 +203,39 @@ "tslint": "^6.1.2" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/jasmine": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.3.tgz", - "integrity": "sha512-LRJ21f/BO4QNZ3YDaMP0OEurOfE77x8mi8MfEnUsei5IKfmZL0GKl7juhABMdUIJHhVS9OCLotKHfsFNAuJ+DA==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/eslint-plugin-tslint": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz", - "integrity": "sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "lodash": "^4.17.15" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "@size-limit/file": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-4.5.7.tgz", + "integrity": "sha512-OCbJsYMELJORRSX386rPWUKoXvF4XNBFZob3amDl/2y1ox7DKdh1hinAWYndJdpZaFRI6rHoR+AXQ9dvWe9Ofg==", "dev": true, "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "7.3.2" }, "dependencies": { "semver": { @@ -326,288 +246,234 @@ } } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "@size-limit/preset-small-lib": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@size-limit/preset-small-lib/-/preset-small-lib-4.5.7.tgz", + "integrity": "sha512-8aRxacxXLeCzvGmAA62F0baRcaKlwDmxR/cofCQFGCtVBC3f9O2Tlk1/K5qu9bqTcCI1nnCA3WFVkQae4irACA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@size-limit/file": "4.5.7", + "@size-limit/webpack": "4.5.7" } }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "@size-limit/webpack": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@size-limit/webpack/-/webpack-4.5.7.tgz", + "integrity": "sha512-S7dg4YR26y431+jWw0TPm6PEuWP5Lh8GFlfmY7smOaZFHvXfpSYhtK/d699/RgxegBDV7UCSj19ZE9RgE3a/Pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" + "css-loader": "^4.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.0.0", + "mkdirp": "^1.0.4", + "nanoid": "^3.1.10", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "pnp-webpack-plugin": "^1.6.4", + "rimraf": "^3.0.2", + "style-loader": "^1.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^3.8.0" }, "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -637,6 +503,91 @@ } } }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -660,6 +611,33 @@ } } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -680,13 +658,23 @@ } } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "arr-diff": "^4.0.0", + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", @@ -701,13 +689,26 @@ "to-regex": "^3.0.2" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, + "optional": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "picomatch": "^2.2.1" } }, "to-regex-range": { @@ -719,488 +720,494 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "webpack": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } } } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "archy": { + "@types/eslint-visitor-keys": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "@types/jasmine": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.3.tgz", + "integrity": "sha512-LRJ21f/BO4QNZ3YDaMP0OEurOfE77x8mi8MfEnUsei5IKfmZL0GKl7juhABMdUIJHhVS9OCLotKHfsFNAuJ+DA==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", "dev": true }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "@typescript-eslint/eslint-plugin-tslint": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz", + "integrity": "sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@typescript-eslint/experimental-utils": "2.34.0", + "lodash": "^4.17.15" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { - "inherits": "2.0.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } } } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" + } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "@webassemblyjs/wast-printer": "1.8.5" } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "@xtuc/ieee754": "^1.2.0" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@xtuc/long": "4.2.2" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "pako": "~1.0.5" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-convert": "^1.9.0" } }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { "braces": { @@ -1219,15 +1226,17 @@ "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "fill-range": { @@ -1240,6 +1249,17 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "is-number": { @@ -1249,15 +1269,47 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" } }, "to-regex-range": { @@ -1272,383 +1324,197 @@ } } }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { - "tslib": "^1.9.0" + "default-require-extensions": "^3.0.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "sprintf-js": "~1.0.2" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "cli-cursor": { + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "cli-truncate": { + "array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "color-name": "1.1.3" + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "glob": "^7.1.3" + "is-descriptor": "^1.0.0" } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -1680,902 +1546,1250 @@ } } }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" } }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "file-uri-to-path": "1.0.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "fill-range": "^7.0.1" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "once": "^1.4.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "ansi-colors": "^4.1.1" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "prr": "~1.0.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "pako": "~1.0.5" } }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "browserslist": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "eslint": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", - "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "glob": "^7.1.3" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001120", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001120.tgz", + "integrity": "sha512-JBP68okZs1X8D7MQTY602jxMYBmXEKOFkzTBaNSkubooMPFOAv2TXWaKle7qgHpjLDhUzA/TMT0qsNleVyXGUQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "color-name": "~1.1.4" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "is-extendable": "^0.1.0" } }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "is-glob": "^4.0.1" + "kind-of": "^3.0.2" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "type-fest": "^0.8.1" + "is-buffer": "^1.1.5" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, - "eslint-ast-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", - "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "lodash.get": "^4.4.2", - "lodash.zip": "^4.2.0" + "tslib": "^1.9.0" } }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } + "ci-job-number": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ci-job-number/-/ci-job-number-1.2.2.tgz", + "integrity": "sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA==", + "dev": true }, - "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "eslint-plugin-jasmine": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz", - "integrity": "sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw==", - "dev": true - }, - "eslint-plugin-unicorn": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", - "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "ci-info": "^2.0.0", - "clean-regexp": "^1.0.0", - "eslint-ast-utils": "^1.1.0", - "eslint-template-visitor": "^1.1.0", - "eslint-utils": "^2.0.0", - "import-modules": "^2.0.0", - "lodash": "^4.17.15", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.21", - "reserved-words": "^0.1.2", - "safe-regex": "^2.1.1", - "semver": "^7.1.3" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "regexp-tree": "~0.1.1" + "is-descriptor": "^0.1.0" } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true } } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "escape-string-regexp": "^1.0.5" } }, - "eslint-template-visitor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", - "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", - "multimap": "^1.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - } + "restore-cursor": "^3.1.0" } }, - "eslint-utils": { + "cli-spinners": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true + }, + "cli-truncate": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - } + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "color-name": "1.1.3" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "execa": { + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "glob": "^7.1.3" } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz", + "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "minimist": "^1.2.5" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "ms": "2.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "postcss": "^7.0.0" } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "css-tree": "1.0.0-alpha.39" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "mdn-data": "2.0.6", + "source-map": "^0.6.1" } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -2607,1176 +2821,3354 @@ } } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "path-type": "^4.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "optional": true + "requires": { + "esutils": "^2.0.2" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } } }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" + "dom-serializer": "0", + "domelementtype": "1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + } } }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.555", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.555.tgz", + "integrity": "sha512-/55x3nF2feXFZ5tdGUOr00TxnUjUgdxhrn+eCJ1FAcoAt+cKQTjQkUC5XF4frMWE1R5sjHk+JueuBalimfe5Pg==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "once": "^1.4.0" } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "ansi-colors": "^4.1.1" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "prr": "~1.0.1" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "is-arrayish": "^0.2.1" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", "dev": true, - "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "optional": true + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "optional": true + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "aproba": { - "version": "1.2.0", - "bundled": true, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true + "requires": { + "color-name": "~1.1.4" + } }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, - "optional": true + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "is-glob": "^4.0.1" } }, - "chownr": { - "version": "1.1.3", - "bundled": true, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, - "optional": true + "requires": { + "type-fest": "^0.8.1" + } }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "optional": true - }, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { "debug": { - "version": "3.2.6", - "bundled": true, + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true + "requires": { + "ms": "2.0.0" + } }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "optional": true + "requires": { + "locate-path": "^2.0.0" + } }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "optional": true, "requires": { - "minipass": "^2.6.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, - "gauge": { - "version": "2.7.4", - "bundled": true, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "p-try": "^1.0.0" } }, - "glob": { - "version": "7.1.6", - "bundled": true, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, - "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "p-limit": "^1.1.0" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "find-up": "^2.1.0" } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + } + } + }, + "eslint-plugin-import": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "ms": "2.0.0" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, - "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, - "minipass": { - "version": "2.9.0", - "bundled": true, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "path-parse": "^1.0.6" } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, + } + } + }, + "eslint-plugin-jasmine": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz", + "integrity": "sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", + "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^1.1.0", + "eslint-utils": "^2.0.0", + "import-modules": "^2.0.0", + "lodash": "^4.17.15", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.21", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.1.3" + }, + "dependencies": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "optional": true, "requires": { - "minipass": "^2.9.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "optional": true, "requires": { - "minimist": "0.0.8" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, - "optional": true, "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "regexp-tree": "~0.1.1" } }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", + "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "multimap": "^1.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, - "optional": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "shebang-regex": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, - "object-assign": { - "version": "4.1.1", - "bundled": true, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.0.tgz", + "integrity": "sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", + "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { + "color-convert": { "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { - "glob": "^7.1.3" + "color-name": "~1.1.4" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.0.0" } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "locate-path": "^3.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "optional": true + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "p-limit": "^2.0.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, - "yallist": { - "version": "3.1.1", - "bundled": true, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "optional": true + "requires": { + "find-up": "^3.0.0" + } } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", "dev": true }, - "functional-red-black-tree": { + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "pump": "^3.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "binary-extensions": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-buffer": "^1.1.5" } } } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "isobject": "^3.0.1" } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "has-symbols": "^1.0.1" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "has": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "has-symbols": "^1.0.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "has-value": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "append-transform": "^2.0.0" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "has-flag": "^4.0.0" } } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "glob": "^7.1.4", + "jasmine-core": "~3.5.0" } }, - "hasha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", - "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "hmac-drbg": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "minimist": "^1.2.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-escaper": { + "lcid": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", - "dev": true + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "lint-staged": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.13.tgz", + "integrity": "sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.0.3", + "listr2": "^2.6.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", + "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "listr2": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.0.tgz", + "integrity": "sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA==", "dev": true, "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.2", + "through": "^2.3.8" }, "dependencies": { "ansi-styles": { @@ -3820,6 +6212,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -3831,880 +6232,902 @@ } } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { + "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "error-ex": "^1.2.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pkg-dir": { + "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "find-up": "^3.0.0" + "minimist": "^1.2.0" } } } }, - "import-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", - "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "semver": "^6.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "p-defer": "^1.0.0" } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "object-visit": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "isobject": "^3.0.1" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "is-stream": { + "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "append-transform": "^2.0.0" + "brace-expansion": "^1.1.7" } }, - "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-plain-object": "^2.0.4" } } } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "minimist": "0.0.8" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "jasmine": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", - "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "jasmine-core": "~3.5.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", "dev": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "optional": true }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "nanoid": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "minimist": "^1.2.0" + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "process-on-spawn": "^1.0.0" } }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "lint-staged": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.13.tgz", - "integrity": "sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==", + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" + "path-key": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { + "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", - "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "listr2": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.0.tgz", - "integrity": "sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA==", + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "nyc": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", + "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", "dev": true, "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.2", - "through": "^2.3.8" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "js-yaml": "^3.13.1", + "make-dir": "^3.0.0", + "node-preload": "^0.2.0", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "uuid": "^3.3.3", + "yargs": "^15.0.2" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "is-descriptor": "^0.1.0" } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-buffer": "^1.1.5" } } } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "isobject": "^3.0.0" } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "p-locate": "^4.1.0" + "isobject": "^3.0.1" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", - "dev": true + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "chalk": "^4.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "dependencies": { "ansi-styles": { @@ -4749,9 +7172,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -4759,827 +7182,809 @@ } } }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { - "yallist": "^3.0.2" + "p-try": "^2.0.0" } }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "semver": "^6.0.0" + "p-limit": "^2.2.0" } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "object-visit": "^1.0.0" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "callsites": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "minimalistic-assert": { + "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "find-up": "^4.0.0" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "semver-compare": "^1.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multimap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", - "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "ts-pnp": "^1.1.6" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "postcss-calc": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", + "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", "dev": true, "requires": { - "process-on-spawn": "^1.0.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true } } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "path-key": "^2.0.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true } } }, - "nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", - "make-dir": "^3.0.0", - "node-preload": "^0.2.0", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "uuid": "^3.3.3", - "yargs": "^15.0.2" + "postcss": "^7.0.0" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "postcss": "^7.0.0" } }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "isobject": "^3.0.0" + "postcss": "^7.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "postcss": "^7.0.0" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "wrappy": "1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dev": true, "requires": { - "p-try": "^2.0.0" + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, - "p-map": { + "postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "postcss": "^7.0.0" } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "callsites": "^3.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" } }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "find-up": "^4.0.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "semver-compare": "^1.0.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "prelude-ls": { @@ -5621,6 +8026,16 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -5680,6 +8095,18 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -5711,6 +8138,24 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -6081,6 +8526,24 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6100,6 +8563,12 @@ "inherits": "^2.0.1" } }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -6133,6 +8602,18 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -6162,12 +8643,70 @@ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", "dev": true }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6203,6 +8742,12 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -6234,6 +8779,151 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "size-limit": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-4.5.7.tgz", + "integrity": "sha512-ANvwaaTvMPGyvsoYnzw7AUUA1Xcj0kC4Pu/Mvvii0RS78TVE7mLL/F0kyVXOw0ytdcq0HoPnT2OaXhwxLlvsyA==", + "dev": true, + "requires": { + "bytes": "^3.1.0", + "chokidar": "^3.4.2", + "ci-job-number": "^1.2.2", + "colorette": "^1.2.1", + "cosmiconfig": "^7.0.0", + "globby": "^11.0.1", + "ora": "^5.0.0", + "read-pkg-up": "^7.0.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6519,6 +9209,12 @@ "figgy-pudding": "^3.5.1" } }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -6540,6 +9236,12 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -6669,6 +9371,103 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6678,6 +9477,27 @@ "has-flag": "^3.0.0" } }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6915,6 +9735,12 @@ "setimmediate": "^1.0.4" } }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -6968,6 +9794,18 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, "ts-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", @@ -7012,6 +9850,12 @@ } } }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, "tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -7136,6 +9980,16 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -7282,6 +10136,18 @@ "set-value": "^2.0.1" } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -7300,6 +10166,18 @@ "imurmurhash": "^0.1.4" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7408,6 +10286,24 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -7430,6 +10326,18 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -7447,6 +10355,25 @@ "neo-async": "^2.5.0" } }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webpack": { "version": "4.41.5", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", @@ -7599,6 +10526,35 @@ "integrity": "sha512-duFSWzZe/OY8zyr2DpymzZeY8yI1RSZ9hu9wDwZy/fhxwntgpEzTwyIB/U7ig+FB26mif8xx5zS1E3Co9c5cYA==", "dev": true }, + "webpack-bundle-analyzer": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", + "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, "webpack-cli": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", @@ -7941,6 +10897,15 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index bcad29d..8d3cac1 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,19 @@ "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./js/typedjson.js", "typings": "./js/typedjson.d.ts", + "size-limit": [ + { + "path": "js/typedjson.js", + "limit": "6.5 KB" + } + ], "scripts": { "lint": "eslint \"spec/**/*.ts\" \"src/**/*.ts\"", "test": "npm run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", "build": "webpack", "preversion": "npm test", - "version": "npm run build && git add -A js" + "version": "npm run build && git add -A js", + "size": "size-limit" }, "repository": { "type": "git", @@ -24,6 +31,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@matthiaskunnen/eslint-config-typescript": "^1.2.0", + "@size-limit/preset-small-lib": "^4.5.7", "@types/jasmine": "^3.5.3", "eslint-plugin-jasmine": "^4.1.1", "husky": "^4.2.5", @@ -31,6 +39,7 @@ "lint-staged": "^10.2.13", "nyc": "^15.0.0", "reflect-metadata": "^0.1.13", + "size-limit": "^4.5.7", "source-map-support": "^0.5.16", "ts-loader": "^6.2.1", "ts-node": "^8.10.2", From 303728c843e761b8f4dbe11f6025352566ea843e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Mon, 31 Aug 2020 21:39:54 +0200 Subject: [PATCH 053/119] Separate size limit github action workflow --- .github/workflows/nodejs.yml | 9 ++------- .github/workflows/size.yml | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/size.yml diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 2f193a1..ffd52b5 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -17,14 +17,9 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - name: npm install - run: npm ci - - uses: andresz1/size-limit-action@v1.4.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - skip_step: install - - name: npm lint, build, test, and size + - name: npm install, lint, build, and test run: | + npm ci npm run lint npm run build --if-present npm test diff --git a/.github/workflows/size.yml b/.github/workflows/size.yml new file mode 100644 index 0000000..377fabd --- /dev/null +++ b/.github/workflows/size.yml @@ -0,0 +1,14 @@ +name: "size" + +on: [pull_request] + +jobs: + size: + runs-on: ubuntu-latest + env: + CI_JOB_NUMBER: 1 + steps: + - uses: actions/checkout@v1 + - uses: andresz1/size-limit-action@v1.4.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} From 022503df68af24e9772ee70b9036135e5f9308a8 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 1 Sep 2020 14:04:44 +0000 Subject: [PATCH 054/119] Add npm and license badge --- readme.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index bc560d7..61812f6 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,8 @@ -[![Build Status](https://github.com/JohnWeisz/TypedJSON/workflows/Node%20CI/badge.svg)](https://github.com/JohnWeisz/TypedJSON/actions) +[![npm version](https://img.shields.io/npm/v/typedjson.svg?logo=npm&style=for-the-badge)](https://www.npmjs.com/package/typedjson) +[![Build Status](https://img.shields.io/github/workflow/status/JohnWeisz/TypedJSON/Node%20CI?label=CI&logo=github&style=for-the-badge) +](https://github.com/JohnWeisz/TypedJSON/actions) +[![Build Status](https://img.shields.io/npm/l/typedjson?&style=for-the-badge&color=green) +](https://github.com/JohnWeisz/typedjson/blob/master/LICENSE) Typed JSON parsing and serializing for TypeScript with [decorators](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md). Annotate your data-classes with simple-to-use decorators and parse standard JSON into actual class instances. For more type-safety and less syntax, recommended to be used with [reflect-metadata](https://github.com/rbuckton/reflect-metadata), a prototype for an ES7 Reflection API for Decorator Metadata. From 2c82f84f4dfae9345d27442610f6185c06adbc61 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 1 Sep 2020 13:23:28 +0000 Subject: [PATCH 055/119] Switch to Yarn --- .github/workflows/nodejs.yml | 12 +- .github/workflows/size.yml | 7 + package-lock.json | 10969 --------------------------------- package.json | 6 +- yarn.lock | 6383 +++++++++++++++++++ 5 files changed, 6399 insertions(+), 10978 deletions(-) delete mode 100644 package-lock.json create mode 100644 yarn.lock diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index ffd52b5..09dc20b 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -17,12 +17,12 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - name: npm install, lint, build, and test + - name: yarn install, lint, build, and test run: | - npm ci - npm run lint - npm run build --if-present - npm test - npm run size + yarn install --frozen-lockfile + yarn run lint + yarn run build + yarn run test + yarn run size env: CI: true diff --git a/.github/workflows/size.yml b/.github/workflows/size.yml index 377fabd..d45c639 100644 --- a/.github/workflows/size.yml +++ b/.github/workflows/size.yml @@ -9,6 +9,13 @@ jobs: CI_JOB_NUMBER: 1 steps: - uses: actions/checkout@v1 + - + name: yarn install + run: | + yarn install --frozen-lockfile + env: + CI: true - uses: andresz1/size-limit-action@v1.4.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} + skip_step: install diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d9b8fc2..0000000 --- a/package-lock.json +++ /dev/null @@ -1,10969 +0,0 @@ -{ - "name": "typedjson", - "version": "1.6.0-rc2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/nyc-config-typescript": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", - "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@matthiaskunnen/eslint-config-base": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@matthiaskunnen/eslint-config-base/-/eslint-config-base-1.2.0.tgz", - "integrity": "sha512-vUfDXwuRKi4sQ9H1vt77ekfC9usswHmuJ3G+DzS8jOnbpQFJe7CGmRDxvOAotREVSoC39FlNbG8m56c/yw/Z5w==", - "dev": true, - "requires": { - "eslint": "^7.5.0", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-unicorn": "^19.0.1" - } - }, - "@matthiaskunnen/eslint-config-typescript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@matthiaskunnen/eslint-config-typescript/-/eslint-config-typescript-1.2.0.tgz", - "integrity": "sha512-8Agbx3rKw1dvg77vvjlCs9LxMl6vxCpr5j1WGvxkTOVAqhDYGilv8Wk/1dGHPVsxZk5ETkj9EvWMyYWPMviHQg==", - "dev": true, - "requires": { - "@matthiaskunnen/eslint-config-base": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^2.31.0", - "@typescript-eslint/eslint-plugin-tslint": "^2.31.0", - "@typescript-eslint/parser": "^2.31.0", - "tslint": "^6.1.2" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@size-limit/file": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-4.5.7.tgz", - "integrity": "sha512-OCbJsYMELJORRSX386rPWUKoXvF4XNBFZob3amDl/2y1ox7DKdh1hinAWYndJdpZaFRI6rHoR+AXQ9dvWe9Ofg==", - "dev": true, - "requires": { - "semver": "7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "@size-limit/preset-small-lib": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@size-limit/preset-small-lib/-/preset-small-lib-4.5.7.tgz", - "integrity": "sha512-8aRxacxXLeCzvGmAA62F0baRcaKlwDmxR/cofCQFGCtVBC3f9O2Tlk1/K5qu9bqTcCI1nnCA3WFVkQae4irACA==", - "dev": true, - "requires": { - "@size-limit/file": "4.5.7", - "@size-limit/webpack": "4.5.7" - } - }, - "@size-limit/webpack": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@size-limit/webpack/-/webpack-4.5.7.tgz", - "integrity": "sha512-S7dg4YR26y431+jWw0TPm6PEuWP5Lh8GFlfmY7smOaZFHvXfpSYhtK/d699/RgxegBDV7UCSj19ZE9RgE3a/Pg==", - "dev": true, - "requires": { - "css-loader": "^4.2.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.0.0", - "mkdirp": "^1.0.4", - "nanoid": "^3.1.10", - "optimize-css-assets-webpack-plugin": "^5.0.3", - "pnp-webpack-plugin": "^1.6.4", - "rimraf": "^3.0.2", - "style-loader": "^1.2.1", - "webpack": "^4.44.1", - "webpack-bundle-analyzer": "^3.8.0" - }, - "dependencies": { - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - } - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/jasmine": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.3.tgz", - "integrity": "sha512-LRJ21f/BO4QNZ3YDaMP0OEurOfE77x8mi8MfEnUsei5IKfmZL0GKl7juhABMdUIJHhVS9OCLotKHfsFNAuJ+DA==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/eslint-plugin-tslint": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz", - "integrity": "sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "lodash": "^4.17.15" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001120", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001120.tgz", - "integrity": "sha512-JBP68okZs1X8D7MQTY602jxMYBmXEKOFkzTBaNSkubooMPFOAv2TXWaKle7qgHpjLDhUzA/TMT0qsNleVyXGUQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "ci-job-number": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ci-job-number/-/ci-job-number-1.2.2.tgz", - "integrity": "sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", - "dev": true - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz", - "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^7.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.555", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.555.tgz", - "integrity": "sha512-/55x3nF2feXFZ5tdGUOr00TxnUjUgdxhrn+eCJ1FAcoAt+cKQTjQkUC5XF4frMWE1R5sjHk+JueuBalimfe5Pg==", - "dev": true - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", - "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-ast-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", - "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", - "dev": true, - "requires": { - "lodash.get": "^4.4.2", - "lodash.zip": "^4.2.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jasmine": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz", - "integrity": "sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw==", - "dev": true - }, - "eslint-plugin-unicorn": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", - "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", - "dev": true, - "requires": { - "ci-info": "^2.0.0", - "clean-regexp": "^1.0.0", - "eslint-ast-utils": "^1.1.0", - "eslint-template-visitor": "^1.1.0", - "eslint-utils": "^2.0.0", - "import-modules": "^2.0.0", - "lodash": "^4.17.15", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.21", - "reserved-words": "^0.1.2", - "safe-regex": "^2.1.1", - "semver": "^7.1.3" - }, - "dependencies": { - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-template-visitor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", - "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", - "multimap": "^1.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - } - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.0.tgz", - "integrity": "sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "dev": true, - "requires": { - "semver-regex": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", - "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "import-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", - "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", - "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "jasmine-core": "~3.5.0" - } - }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "lint-staged": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.13.tgz", - "integrity": "sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", - "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "listr2": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.0.tgz", - "integrity": "sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.2", - "through": "^2.3.8" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", - "dev": true - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multimap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", - "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", - "make-dir": "^3.0.0", - "node-preload": "^0.2.0", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "uuid": "^3.3.3", - "yargs": "^15.0.2" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", - "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", - "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp-tree": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", - "integrity": "sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==", - "dev": true - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "size-limit": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-4.5.7.tgz", - "integrity": "sha512-ANvwaaTvMPGyvsoYnzw7AUUA1Xcj0kC4Pu/Mvvii0RS78TVE7mLL/F0kyVXOw0ytdcq0HoPnT2OaXhwxLlvsyA==", - "dev": true, - "requires": { - "bytes": "^3.1.0", - "chokidar": "^3.4.2", - "ci-job-number": "^1.2.2", - "colorette": "^1.2.1", - "cosmiconfig": "^7.0.0", - "globby": "^11.0.1", - "ora": "^5.0.0", - "read-pkg-up": "^7.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", - "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" - }, - "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "ts-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", - "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^4.0.0", - "semver": "^6.0.0" - } - }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - }, - "uglify-js": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", - "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", - "dev": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "uglify-js": "^3.6.0", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-auto-inject-version": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/webpack-auto-inject-version/-/webpack-auto-inject-version-1.2.2.tgz", - "integrity": "sha512-duFSWzZe/OY8zyr2DpymzZeY8yI1RSZ9hu9wDwZy/fhxwntgpEzTwyIB/U7ig+FB26mif8xx5zS1E3Co9c5cYA==", - "dev": true - }, - "webpack-bundle-analyzer": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", - "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 8d3cac1..66d30e7 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ ], "scripts": { "lint": "eslint \"spec/**/*.ts\" \"src/**/*.ts\"", - "test": "npm run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", + "test": "yarn run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", "build": "webpack", - "preversion": "npm test", - "version": "npm run build && git add -A js", + "preversion": "yarn test", + "version": "yarn run build && git add -A js", "size": "size-limit" }, "repository": { diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..77e7dbf --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6383 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@^7.7.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d" + integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.6.1" + +"@babel/generator@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82" + integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g== + dependencies: + "@babel/types" "^7.11.5" + jsesc "^2.5.1" + source-map "^0.6.1" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@eslint/eslintrc@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.0.tgz#3d1f19fb797d42fb1c85458c1c73541eeb1d9e76" + integrity sha512-bfL5365QSCmH6cPeFT7Ywclj8C7LiF7sO6mUGzZhtAMV7iID1Euq6740u/SRi4C80NOnVz/CEfK8/HO+nCAPJg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + import-fresh "^3.2.1" + strip-json-comments "^3.1.1" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/nyc-config-typescript@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz#55172f5663b3635586add21b14d42ca94a163d58" + integrity sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ== + dependencies: + "@istanbuljs/schema" "^0.1.2" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@matthiaskunnen/eslint-config-base@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-base/-/eslint-config-base-1.2.0.tgz#4e6852af919c4bf7514b1c8586e04ed0f5cd0089" + integrity sha512-vUfDXwuRKi4sQ9H1vt77ekfC9usswHmuJ3G+DzS8jOnbpQFJe7CGmRDxvOAotREVSoC39FlNbG8m56c/yw/Z5w== + dependencies: + eslint "^7.5.0" + eslint-plugin-import "^2.20.2" + eslint-plugin-unicorn "^19.0.1" + +"@matthiaskunnen/eslint-config-typescript@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-typescript/-/eslint-config-typescript-1.3.0.tgz#cde52073a1a7fbebcfd6e00f9b5080084c0a76fe" + integrity sha512-vR8bZwQCGGNyKsidfQla6mYlcAWPL5MV27IFC+U0ttd3gdyEqnh3/nRIn42VZdQSrRryAux+qbkybhGyeO9Znw== + dependencies: + "@matthiaskunnen/eslint-config-base" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^2.31.0" + "@typescript-eslint/eslint-plugin-tslint" "^2.31.0" + "@typescript-eslint/parser" "^2.31.0" + tslint "^6.1.2" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@size-limit/file@4.5.7": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@size-limit/file/-/file-4.5.7.tgz#29ce728aa83e3d7ee48421a32894cdf4954405ca" + integrity sha512-OCbJsYMELJORRSX386rPWUKoXvF4XNBFZob3amDl/2y1ox7DKdh1hinAWYndJdpZaFRI6rHoR+AXQ9dvWe9Ofg== + dependencies: + semver "7.3.2" + +"@size-limit/preset-small-lib@^4.5.7": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@size-limit/preset-small-lib/-/preset-small-lib-4.5.7.tgz#db903c7a446eaa932e92d502c3b4e7a18ca3a335" + integrity sha512-8aRxacxXLeCzvGmAA62F0baRcaKlwDmxR/cofCQFGCtVBC3f9O2Tlk1/K5qu9bqTcCI1nnCA3WFVkQae4irACA== + dependencies: + "@size-limit/file" "4.5.7" + "@size-limit/webpack" "4.5.7" + +"@size-limit/webpack@4.5.7": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@size-limit/webpack/-/webpack-4.5.7.tgz#3b1210a486ff1c2b31e6adaa7c8f1e56711b17ba" + integrity sha512-S7dg4YR26y431+jWw0TPm6PEuWP5Lh8GFlfmY7smOaZFHvXfpSYhtK/d699/RgxegBDV7UCSj19ZE9RgE3a/Pg== + dependencies: + css-loader "^4.2.1" + escape-string-regexp "^4.0.0" + file-loader "^6.0.0" + mkdirp "^1.0.4" + nanoid "^3.1.10" + optimize-css-assets-webpack-plugin "^5.0.3" + pnp-webpack-plugin "^1.6.4" + rimraf "^3.0.2" + style-loader "^1.2.1" + webpack "^4.44.1" + webpack-bundle-analyzer "^3.8.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/jasmine@^3.5.3": + version "3.5.14" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.14.tgz#f41a14e8ffa939062a71cf9722e5ee7d4e1f94af" + integrity sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w== + +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@typescript-eslint/eslint-plugin-tslint@^2.31.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz#0a2cea8e9a0726ae5a42cecd94095b41b749a8e7" + integrity sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + lodash "^4.17.15" + +"@typescript-eslint/eslint-plugin@^2.31.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.31.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" + integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== + dependencies: + caniuse-lite "^1.0.30001111" + electron-to-chromium "^1.3.523" + escalade "^3.0.2" + node-releases "^1.1.60" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.0, bytes@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001111: + version "1.0.30001122" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001122.tgz#2c8ff631330d986a07a7ba7125cce77a1373b475" + integrity sha512-pxjw28CThdrqfz06nJkpAc5SXM404TXB/h5f4UJX+rrXJKE/1bu/KAILc2AY+O6cQIFtRjV9qOR2vaEp9LDGUA== + +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1, chokidar@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-job-number@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ci-job-number/-/ci-job-number-1.2.2.tgz#f4e5918fcaeeda95b604f214be7d7d4a961fe0c0" + integrity sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" + integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +commander@^2.12.1, commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.2.tgz#b668b3488d566dc22ebcf9425c5f254a05808c89" + integrity sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^7.3.2" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.523: + version "1.3.556" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.556.tgz#d2a8fed6b93051c5c27d182c43c7bc4d88b77afb" + integrity sha512-g5cGpg6rOCXxyfaLCQIWz9Fx+raFfbZ6sc4QLfvvaiCERBzY6YD6rh5d12QN++bEF1Tm9osYnxP37lbN/92j4A== + +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5, enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escalade@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-ast-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-import-resolver-node@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.20.2: + version "2.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" + integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jasmine@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz#afdf8ca6a91e85041d9e0fb650af446874bf8852" + integrity sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw== + +eslint-plugin-unicorn@^19.0.1: + version "19.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz#05eef02f33426b8aa4f21cd5e4785b456335b85b" + integrity sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q== + dependencies: + ci-info "^2.0.0" + clean-regexp "^1.0.0" + eslint-ast-utils "^1.1.0" + eslint-template-visitor "^1.1.0" + eslint-utils "^2.0.0" + import-modules "^2.0.0" + lodash "^4.17.15" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.21" + reserved-words "^0.1.2" + safe-regex "^2.1.1" + semver "^7.1.3" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-template-visitor@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz#f090d124d1a52e05552149fc50468ed59608b166" + integrity sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw== + dependencies: + eslint-visitor-keys "^1.1.0" + espree "^6.1.1" + multimap "^1.0.2" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^7.5.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.0.tgz#9a3e2e6e4d0a3f8c42686073c25ebf2e91443e8a" + integrity sha512-qgtVyLZqKd2ZXWnLQA4NtVbOyH56zivOAdBFWE54RFkSZjokzNrcP4Z0eVWsZ+84ByXv+jL9k/wE1ENYe8xRFw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.3.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" + integrity sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fromentries@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" + integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" + integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +husky@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" + integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^6.0.0" + find-versions "^3.2.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" + integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" + integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.0" + istanbul-lib-coverage "^3.0.0-alpha.1" + make-dir "^3.0.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^3.3.3" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" + integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== + +jasmine@^3.5.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.6.1.tgz#a20456b309a669b547a3c24bb2120f16f70cfc65" + integrity sha512-Jqp8P6ZWkTVFGmJwBK46p+kJNrZCdqkQ4GL+PGuBXZwK1fM4ST9BizkYgIwCFqYYqnTizAy6+XG2Ej5dFrej9Q== + dependencies: + fast-glob "^2.2.6" + jasmine-core "~3.6.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz#371873c5ffa44304a6ba12419bcfa95f404ae081" + integrity sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@^10.2.13: + version "10.2.13" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.13.tgz#b9c504683470edfc464b7d3fe3845a5a1efcd814" + integrity sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + commander "^6.0.0" + cosmiconfig "^7.0.0" + debug "^4.1.1" + dedent "^0.7.0" + enquirer "^2.3.6" + execa "^4.0.3" + listr2 "^2.6.0" + log-symbols "^4.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + +listr2@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.6.2.tgz#4912eb01e1e2dd72ec37f3895a56bf2622d6f36a" + integrity sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + rxjs "^6.6.2" + through "^2.3.8" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.0.2, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multimap@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" + integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanoid@^3.1.10: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + +node-releases@^1.1.60: + version "1.1.60" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nyc@^15.0.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.0.0.tgz#4f0b34f2994877b49b452a707245ab1e9f6afccb" + integrity sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw== + dependencies: + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.4.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +pnp-webpack-plugin@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" + integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.21, regexp-tree@~0.1.1: + version "0.1.21" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" + integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.6, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.3.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^1.7.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +size-limit@^4.5.7: + version "4.5.7" + resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-4.5.7.tgz#0bfb8b3bddad0c38388bd0bd3d98bbd7d5b7daee" + integrity sha512-ANvwaaTvMPGyvsoYnzw7AUUA1Xcj0kC4Pu/Mvvii0RS78TVE7mLL/F0kyVXOw0ytdcq0HoPnT2OaXhwxLlvsyA== + dependencies: + bytes "^3.1.0" + chokidar "^3.4.2" + ci-job-number "^1.2.2" + colorette "^1.2.1" + cosmiconfig "^7.0.0" + globby "^11.0.1" + ora "^5.0.0" + read-pkg-up "^7.0.1" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-loader@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58" + integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + +ts-node@^8.10.2: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslint@^6.1.2: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.0, type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.9.7: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +uglify-js@^3.6.0: + version "3.10.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.3.tgz#f0d2f99736c14de46d2d24649ba328be3e71c3bf" + integrity sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g== + +uglifyjs-webpack-plugin@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7" + integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + uglify-js "^3.6.0" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webpack-auto-inject-version@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/webpack-auto-inject-version/-/webpack-auto-inject-version-1.2.2.tgz#8fa15f6ea7c4a2a4adcdc5d8b1dc47693dddc971" + integrity sha512-duFSWzZe/OY8zyr2DpymzZeY8yI1RSZ9hu9wDwZy/fhxwntgpEzTwyIB/U7ig+FB26mif8xx5zS1E3Co9c5cYA== + +webpack-bundle-analyzer@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" + integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.3.10: + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== + dependencies: + chalk "^2.4.2" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.1" + findup-sync "^3.0.0" + global-modules "^2.0.0" + import-local "^2.0.0" + interpret "^1.4.0" + loader-utils "^1.4.0" + supports-color "^6.1.0" + v8-compile-cache "^2.1.1" + yargs "^13.3.2" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.5, webpack@^4.44.1: + version "4.44.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" + integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From 610913d7a3910234464dbc765a504506942bedf2 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 29 Aug 2020 16:07:24 +0000 Subject: [PATCH 056/119] Change build process - Separate bundles, see tsconfig/README.md - Change build dir to lib - Remove JS from VCS - Remove Webpack, everything is handled by TypeScript - Include src in package, this allows navigating to source by developers - Stopped building on test script Building on test slows down testing - Use transpile-only in test script This improves test speed by ~2 seconds - unwrap src/typedjson --- .gitignore | 2 +- js/parser.d.ts | 137 -- js/typedjson.d.ts | 9 - js/typedjson.js | 1886 ----------------- js/typedjson.js.map | 1 - js/typedjson.min.js | 3 - js/typedjson.min.js.map | 1 - js/typedjson/deserializer.d.ts | 28 - js/typedjson/helpers.d.ts | 42 - js/typedjson/json-array-member.d.ts | 27 - js/typedjson/json-map-member.d.ts | 25 - js/typedjson/json-member.d.ts | 36 - js/typedjson/json-object.d.ts | 67 - js/typedjson/json-set-member.d.ts | 24 - js/typedjson/metadata.d.ts | 69 - js/typedjson/options-base.d.ts | 20 - js/typedjson/serializer.d.ts | 40 - js/typedjson/to-json.d.ts | 22 - js/typedjson/type-descriptor.d.ts | 51 - js/typedjson/types.d.ts | 8 - lint-staged.config.js | 1 + package.json | 37 +- spec/array.spec.ts | 2 +- spec/base.spec.ts | 2 +- spec/before-serialization.spec.ts | 2 +- spec/custom-deserializer.spec.ts | 2 +- spec/custom-serializer.spec.ts | 2 +- spec/helpers.spec.ts | 2 +- spec/initializer.spec.ts | 2 +- spec/just-json.spec.ts | 2 +- spec/map.spec.ts | 8 +- spec/on-deserialized.spec.ts | 2 +- spec/parse-to-object.spec.ts | 2 +- spec/polymorphism-abstract-class.spec.ts | 2 +- spec/polymorphism-custom-names.spec.ts | 2 +- spec/polymorphism-custom-type-hints.spec.ts | 4 +- spec/polymorphism-interface.spec.ts | 2 +- spec/polymorphism-nested-arrays.spec.ts | 2 +- spec/polymorphism-root-abstract-class.spec.ts | 2 +- spec/polymorphism.spec.ts | 2 +- spec/preserve-null.spec.ts | 2 +- spec/set.spec.ts | 2 +- spec/to-json.spec.ts | 2 +- spec/utils/everything.ts | 2 +- src/{typedjson => }/deserializer.ts | 0 src/{typedjson => }/helpers.ts | 0 src/index.ts | 15 + src/{typedjson => }/json-array-member.ts | 0 src/{typedjson => }/json-map-member.ts | 0 src/{typedjson => }/json-member.ts | 0 src/{typedjson => }/json-object.ts | 0 src/{typedjson => }/json-set-member.ts | 0 src/{typedjson => }/metadata.ts | 0 src/{typedjson => }/options-base.ts | 0 src/parser.ts | 16 +- src/{typedjson => }/serializer.ts | 0 src/{typedjson => }/to-json.ts | 2 +- src/{typedjson => }/type-descriptor.ts | 0 src/typedjson.ts | 15 - src/{typedjson => }/types.ts | 0 tsconfig/README.md | 33 + tsconfig/tsconfig.app-base.json | 6 + tsconfig/tsconfig.app.json | 9 +- tsconfig/tsconfig.base.json | 20 +- tsconfig/tsconfig.bundle.cjs.json | 8 + tsconfig/tsconfig.bundle.esm.json | 9 + tsconfig/tsconfig.bundle.esm5.json | 9 + tsconfig/tsconfig.bundle.types.json | 12 + webpack.config.js | 59 - yarn.lock | 299 +-- 70 files changed, 251 insertions(+), 2849 deletions(-) delete mode 100644 js/parser.d.ts delete mode 100644 js/typedjson.d.ts delete mode 100644 js/typedjson.js delete mode 100644 js/typedjson.js.map delete mode 100644 js/typedjson.min.js delete mode 100644 js/typedjson.min.js.map delete mode 100644 js/typedjson/deserializer.d.ts delete mode 100644 js/typedjson/helpers.d.ts delete mode 100644 js/typedjson/json-array-member.d.ts delete mode 100644 js/typedjson/json-map-member.d.ts delete mode 100644 js/typedjson/json-member.d.ts delete mode 100644 js/typedjson/json-object.d.ts delete mode 100644 js/typedjson/json-set-member.d.ts delete mode 100644 js/typedjson/metadata.d.ts delete mode 100644 js/typedjson/options-base.d.ts delete mode 100644 js/typedjson/serializer.d.ts delete mode 100644 js/typedjson/to-json.d.ts delete mode 100644 js/typedjson/type-descriptor.d.ts delete mode 100644 js/typedjson/types.d.ts rename src/{typedjson => }/deserializer.ts (100%) rename src/{typedjson => }/helpers.ts (100%) create mode 100644 src/index.ts rename src/{typedjson => }/json-array-member.ts (100%) rename src/{typedjson => }/json-map-member.ts (100%) rename src/{typedjson => }/json-member.ts (100%) rename src/{typedjson => }/json-object.ts (100%) rename src/{typedjson => }/json-set-member.ts (100%) rename src/{typedjson => }/metadata.ts (100%) rename src/{typedjson => }/options-base.ts (100%) rename src/{typedjson => }/serializer.ts (100%) rename src/{typedjson => }/to-json.ts (97%) rename src/{typedjson => }/type-descriptor.ts (100%) delete mode 100644 src/typedjson.ts rename src/{typedjson => }/types.ts (100%) create mode 100644 tsconfig/README.md create mode 100644 tsconfig/tsconfig.app-base.json create mode 100644 tsconfig/tsconfig.bundle.cjs.json create mode 100644 tsconfig/tsconfig.bundle.esm.json create mode 100644 tsconfig/tsconfig.bundle.esm5.json create mode 100644 tsconfig/tsconfig.bundle.types.json delete mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index 8eff110..c7e3aa3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ bin node_modules packages coverage +/lib nuget nupkg obj @@ -27,4 +28,3 @@ temp **\nuget **\nupkg __* - diff --git a/js/parser.d.ts b/js/parser.d.ts deleted file mode 100644 index 6a1d9d4..0000000 --- a/js/parser.d.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { defaultTypeResolver } from './typedjson/deserializer'; -import { TypeHintEmitter, TypeResolver } from './typedjson/metadata'; -import { OptionsBase } from './typedjson/options-base'; -import { defaultTypeEmitter } from './typedjson/serializer'; -import { Constructor, IndexedObject, Serializable } from './typedjson/types'; -export declare type JsonTypes = Object | boolean | string | number | null | undefined; -export { defaultTypeResolver, defaultTypeEmitter }; -export interface ITypedJSONSettings extends OptionsBase { - /** - * Sets the handler callback to invoke on errors during serializing and deserializing. - * Re-throwing errors in this function will halt serialization/deserialization. - * The default behavior is to log errors to the console. - */ - errorHandler?: ((e: Error) => void) | null; - /** - * Sets a callback that determines the constructor of the correct sub-type of polymorphic - * objects while deserializing. - * The default behavior is to read the type-name from the '__type' property of 'sourceObject', - * and look it up in 'knownTypes'. - * The constructor of the sub-type should be returned. - */ - typeResolver?: TypeResolver | null; - nameResolver?: ((ctor: Function) => string) | null; - /** - * Sets a callback that writes type-hints to serialized objects. - * The default behavior is to write the type-name to the '__type' property, if a derived type - * is present in place of a base type. - */ - typeHintEmitter?: TypeHintEmitter | null; - /** - * Sets the amount of indentation to use in produced JSON strings. - * Default value is 0, or no indentation. - */ - indent?: number | null; - replacer?: ((key: string, value: any) => any) | null; - knownTypes?: Array> | null; -} -export declare class TypedJSON { - private static _globalConfig; - private serializer; - private deserializer; - private globalKnownTypes; - private indent; - private rootConstructor; - private errorHandler; - private nameResolver; - private replacer?; - /** - * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object - * instances of the specified root class type. - * @param rootConstructor The constructor of the root class type. - * @param settings Additional configuration settings. - */ - constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings); - static parse(object: any, rootType: Serializable, settings?: ITypedJSONSettings): T | undefined; - static parseAsArray(object: any, elementType: Serializable, settings?: ITypedJSONSettings, dimensions?: 1): Array; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 2): Array>; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 3): Array>>; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 4): Array>>>; - static parseAsArray(object: any, elementType: Serializable, settings: ITypedJSONSettings | undefined, dimensions: 5): Array>>>>; - static parseAsSet(object: any, elementType: Serializable, settings?: ITypedJSONSettings): Set; - static parseAsMap(object: any, keyType: Serializable, valueType: Serializable, settings?: ITypedJSONSettings): Map; - static toPlainJson(object: T, rootType: Serializable, settings?: ITypedJSONSettings): JsonTypes; - static toPlainArray(object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): Array; - static toPlainArray(object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): Array>; - static toPlainArray(object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): Array>>; - static toPlainArray(object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): Array>>>; - static toPlainArray(object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): Array>>>>; - static toPlainArray(object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): Array; - static toPlainSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): Array | undefined; - static toPlainMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): IndexedObject | Array<{ - key: any; - value: any; - }> | undefined; - static stringify(object: T, rootType: Serializable, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array, elementType: Serializable, dimensions?: 1, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array>, elementType: Serializable, dimensions: 2, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array>>, elementType: Serializable, dimensions: 3, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array>>>, elementType: Serializable, dimensions: 4, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array>>>>, elementType: Serializable, dimensions: 5, settings?: ITypedJSONSettings): string; - static stringifyAsArray(object: Array, elementType: Serializable, dimensions: number, settings?: ITypedJSONSettings): string; - static stringifyAsSet(object: Set, elementType: Serializable, settings?: ITypedJSONSettings): string; - static stringifyAsMap(object: Map, keyCtor: Serializable, valueCtor: Serializable, settings?: ITypedJSONSettings): string; - static setGlobalConfig(config: ITypedJSONSettings): void; - /** - * Configures TypedJSON through a settings object. - * @param settings The configuration settings object. - */ - config(settings: ITypedJSONSettings): void; - /** - * Converts a JSON string to the root class type. - * @param object The JSON to parse and convert. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns Deserialized T or undefined if there were errors. - */ - parse(object: any): T | undefined; - parseAsArray(object: any, dimensions?: 1): Array; - parseAsArray(object: any, dimensions: 2): Array>; - parseAsArray(object: any, dimensions: 3): Array>>; - parseAsArray(object: any, dimensions: 4): Array>>>; - parseAsArray(object: any, dimensions: 5): Array>>>>; - parseAsArray(object: any, dimensions: number): Array; - parseAsSet(object: any): Set; - parseAsMap(object: any, keyConstructor: Serializable): Map; - /** - * Converts an instance of the specified class type to a plain JSON object. - * @param object The instance to convert to a JSON string. - * @returns Serialized object or undefined if an error has occured. - */ - toPlainJson(object: T): JsonTypes; - toPlainArray(object: Array, dimensions?: 1): Array; - toPlainArray(object: Array>, dimensions: 2): Array>; - toPlainArray(object: Array>>, dimensions: 3): Array>>; - toPlainArray(object: Array>>>, dimensions: 4): Array>>>; - toPlainArray(object: Array>>>>, dimensions: 5): Array>>>>; - toPlainSet(object: Set): Array | undefined; - toPlainMap(object: Map, keyConstructor: Serializable): IndexedObject | Array<{ - key: any; - value: any; - }> | undefined; - /** - * Converts an instance of the specified class type to a JSON string. - * @param object The instance to convert to a JSON string. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns String with the serialized object or an empty string if an error has occured, but - * the errorHandler did not throw. - */ - stringify(object: T): string; - stringifyAsArray(object: Array, dimensions?: 1): string; - stringifyAsArray(object: Array>, dimensions: 2): string; - stringifyAsArray(object: Array>>, dimensions: 3): string; - stringifyAsArray(object: Array>>>, dimensions: 4): string; - stringifyAsArray(object: Array>>>>, dimensions: 5): string; - stringifyAsSet(object: Set): string; - stringifyAsMap(object: Map, keyConstructor: Serializable): string; - private _mapKnownTypes; -} diff --git a/js/typedjson.d.ts b/js/typedjson.d.ts deleted file mode 100644 index 41d25e3..0000000 --- a/js/typedjson.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { TypedJSON, ITypedJSONSettings, JsonTypes, defaultTypeResolver, defaultTypeEmitter, } from './parser'; -export { TypeResolver, TypeHintEmitter, JsonObjectMetadata } from './typedjson/metadata'; -export { jsonObject } from './typedjson/json-object'; -export { jsonMember } from './typedjson/json-member'; -export { jsonArrayMember } from './typedjson/json-array-member'; -export { jsonSetMember } from './typedjson/json-set-member'; -export { jsonMapMember } from './typedjson/json-map-member'; -export { toJson } from './typedjson/to-json'; -export { ArrayT, SetT, MapT } from './typedjson/type-descriptor'; diff --git a/js/typedjson.js b/js/typedjson.js deleted file mode 100644 index 037ec9a..0000000 --- a/js/typedjson.js +++ /dev/null @@ -1,1886 +0,0 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-30 - (function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define("typedjson", [], factory); - else if(typeof exports === 'object') - exports["typedjson"] = factory(); - else - root["typedjson"] = factory(); -})((typeof self !== 'undefined' ? self : this), function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); - -// CONCATENATED MODULE: ./src/typedjson/helpers.ts -var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -}; -var MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' - + ' and "emitDecoratorMetadata" in your tsconfig.json?'; -/** - * Determines whether the specified type is a type that can be passed on "as-is" into - * `JSON.stringify`. - * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` - * for `number`). - */ -function isDirectlySerializableNativeType(type) { - return [Date, Number, String, Boolean].indexOf(type) !== -1; -} -function isDirectlyDeserializableNativeType(type) { - return [Number, String, Boolean].indexOf(type) !== -1; -} -function isTypeTypedArray(type) { - return [ - Float32Array, - Float64Array, - Int8Array, - Uint8Array, - Uint8ClampedArray, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - ].indexOf(type) !== -1; -} -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. - * @param B The supposed base type. - */ -function isSubtypeOf(A, B) { - return A === B || A.prototype instanceof B; -} -function logError(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.error === 'function') { - console.error.apply(console, __spreadArrays([message], optionalParams)); - } - else if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays(["ERROR: " + message], optionalParams)); - } -} -function logMessage(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays([message], optionalParams)); - } -} -function logWarning(message) { - var optionalParams = []; - for (var _i = 1; _i < arguments.length; _i++) { - optionalParams[_i - 1] = arguments[_i]; - } - if (typeof console === 'object' && typeof console.warn === 'function') { - console.warn.apply(console, __spreadArrays([message], optionalParams)); - } - else if (typeof console === 'object' && typeof console.log === 'function') { - console.log.apply(console, __spreadArrays(["WARNING: " + message], optionalParams)); - } -} -/** - * Checks if the value is considered defined (not undefined and not null). - * @param value - */ -function isValueDefined(value) { - return !(typeof value === 'undefined' || value === null); -} -function isInstanceOf(value, constructor) { - if (typeof value === 'number') { - return constructor === Number; - } - else if (typeof value === 'string') { - return constructor === String; - } - else if (typeof value === 'boolean') { - return constructor === Boolean; - } - else if (isObject(value)) { - return value instanceof constructor; - } - return false; -} -var isReflectMetadataSupported = typeof Reflect === 'object' && typeof Reflect.getMetadata === 'function'; -/** - * Gets the name of a function. - * @param fn The function whose name to get. - */ -function nameof(fn) { - if (typeof fn.name === 'string') { - return fn.name; - } - return 'undefined'; -} -function identity(arg) { - return arg; -} - -// CONCATENATED MODULE: ./src/typedjson/metadata.ts - -var METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; -var metadata_JsonObjectMetadata = /** @class */ (function () { - function JsonObjectMetadata(classType) { - this.dataMembers = new Map(); - /** Set of known types used for polymorphic deserialization */ - this.knownTypes = new Set(); - /** - * Indicates whether this class was explicitly annotated with @jsonObject - * or implicitly by @jsonMember - */ - this.isExplicitlyMarked = false; - /** - * Indicates whether this type is handled without annotation. This is usually - * used for the builtin types (except for Maps, Sets, and normal Arrays). - */ - this.isHandledWithoutAnnotation = false; - this.classType = classType; - } - /** - * Gets the name of a class as it appears in a serialized JSON string. - * @param ctor The constructor of a class (with or without jsonObject). - */ - JsonObjectMetadata.getJsonObjectName = function (ctor) { - var metadata = JsonObjectMetadata.getFromConstructor(ctor); - return metadata === undefined ? nameof(ctor) : nameof(metadata.classType); - }; - /** - * Gets jsonObject metadata information from a class. - * @param ctor The constructor class. - */ - JsonObjectMetadata.getFromConstructor = function (ctor) { - var prototype = ctor.prototype; - if (prototype == null) { - return; - } - var metadata; - if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) { - // The class prototype contains own jsonObject metadata - metadata = prototype[METADATA_FIELD_KEY]; - } - // Ignore implicitly added jsonObject (through jsonMember) - if ((metadata === null || metadata === void 0 ? void 0 : metadata.isExplicitlyMarked) === true) { - return metadata; - } - // In the end maybe it is something which we can handle directly - if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) { - var primitiveMeta = new JsonObjectMetadata(ctor); - primitiveMeta.isExplicitlyMarked = true; - // we do not store the metadata here to not modify builtin prototype - return primitiveMeta; - } - }; - JsonObjectMetadata.ensurePresentInPrototype = function (prototype) { - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { - return prototype[METADATA_FIELD_KEY]; - } - // Target has no JsonObjectMetadata associated with it yet, create it now. - var objectMetadata = new JsonObjectMetadata(prototype.constructor); - // Inherit json members and known types from parent @jsonObject (if any). - var parentMetadata = prototype[METADATA_FIELD_KEY]; - if (parentMetadata !== undefined) { - parentMetadata.dataMembers.forEach(function (memberMetadata, propKey) { - objectMetadata.dataMembers.set(propKey, memberMetadata); - }); - parentMetadata.knownTypes.forEach(function (knownType) { - objectMetadata.knownTypes.add(knownType); - }); - objectMetadata.typeResolver = parentMetadata.typeResolver; - objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter; - } - Object.defineProperty(prototype, METADATA_FIELD_KEY, { - enumerable: false, - configurable: false, - writable: false, - value: objectMetadata, - }); - return objectMetadata; - }; - /** - * Gets the known type name of a jsonObject class for type hint. - * @param constructor The constructor class. - */ - JsonObjectMetadata.getKnownTypeNameFromType = function (constructor) { - var metadata = JsonObjectMetadata.getFromConstructor(constructor); - return metadata === undefined ? nameof(constructor) : nameof(metadata.classType); - }; - JsonObjectMetadata.doesHandleWithoutAnnotation = function (ctor) { - return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) - || ctor === DataView || ctor === ArrayBuffer; - }; - return JsonObjectMetadata; -}()); - -function injectMetadataInformation(prototype, propKey, metadata) { - // For error messages - var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); - // When a property decorator is applied to a static member, 'constructor' is a constructor - // function. - // See: - // eslint-disable-next-line max-len - // https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators - // ... and static members are not supported here, so abort. - if (typeof prototype === 'function') { - logError(decoratorName + ": cannot use a static property."); - return; - } - // Methods cannot be serialized. - // symbol indexing is not supported by ts - if (typeof prototype[propKey] === 'function') { - logError(decoratorName + ": cannot use a method property."); - return; - } - // @todo check if metadata is ever undefined, if so, change parameter type - if (metadata == null - || (metadata.type === undefined && metadata.deserializer === undefined)) { - logError(decoratorName + ": JsonMemberMetadata has unknown type."); - return; - } - // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype). - // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked - // with '@jsonObject' as well. - var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(prototype); - if (metadata.deserializer === undefined) { - // If deserializer is not present then type must be - metadata.type.getTypes().forEach(function (ctor) { return objectMetadata.knownTypes.add(ctor); }); - } - // clear metadata of undefined properties to save memory - Object.keys(metadata) - .forEach(function (key) { return (metadata[key] === undefined) && delete metadata[key]; }); - objectMetadata.dataMembers.set(metadata.name, metadata); -} - -// CONCATENATED MODULE: ./src/typedjson/options-base.ts -var __assign = (undefined && undefined.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var kAllOptions = [ - 'preserveNull', -]; -function extractOptionBase(from) { - var options = Object.keys(from) - .filter(function (key) { return kAllOptions.indexOf(key) > -1; }) - .reduce(function (obj, key) { - obj[key] = from[key]; - return obj; - }, {}); - return Object.keys(options).length > 0 ? options : undefined; -} -function getDefaultOptionOf(key) { - switch (key) { - case 'preserveNull': - return false; - } - // never reached - return null; -} -function getOptionValue(key, options) { - if (options != null && options[key] != null) { - return options[key]; - } - return getDefaultOptionOf(key); -} -function mergeOptions(existing, moreSpecific) { - return moreSpecific == null - ? existing - : __assign(__assign({}, existing), moreSpecific); -} - -// CONCATENATED MODULE: ./src/typedjson/type-descriptor.ts -var __extends = (undefined && undefined.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var TypeDescriptor = /** @class */ (function () { - function TypeDescriptor(ctor) { - this.ctor = ctor; - } - TypeDescriptor.prototype.getTypes = function () { - return [this.ctor]; - }; - return TypeDescriptor; -}()); - -var ConcreteTypeDescriptor = /** @class */ (function (_super) { - __extends(ConcreteTypeDescriptor, _super); - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - function ConcreteTypeDescriptor(ctor) { - return _super.call(this, ctor) || this; - } - return ConcreteTypeDescriptor; -}(TypeDescriptor)); - -var GenericTypeDescriptor = /** @class */ (function (_super) { - __extends(GenericTypeDescriptor, _super); - function GenericTypeDescriptor(ctor) { - return _super.call(this, ctor) || this; - } - return GenericTypeDescriptor; -}(TypeDescriptor)); - -var ArrayTypeDescriptor = /** @class */ (function (_super) { - __extends(ArrayTypeDescriptor, _super); - function ArrayTypeDescriptor(elementType) { - var _this = _super.call(this, Array) || this; - _this.elementType = elementType; - return _this; - } - ArrayTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); - }; - return ArrayTypeDescriptor; -}(GenericTypeDescriptor)); - -function ArrayT(elementType) { - return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType)); -} -var SetTypeDescriptor = /** @class */ (function (_super) { - __extends(SetTypeDescriptor, _super); - function SetTypeDescriptor(elementType) { - var _this = _super.call(this, Set) || this; - _this.elementType = elementType; - return _this; - } - SetTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.elementType.getTypes()); - }; - return SetTypeDescriptor; -}(GenericTypeDescriptor)); - -function SetT(elementType) { - return new SetTypeDescriptor(ensureTypeDescriptor(elementType)); -} -var MapTypeDescriptor = /** @class */ (function (_super) { - __extends(MapTypeDescriptor, _super); - function MapTypeDescriptor(keyType, valueType, options) { - var _this = _super.call(this, Map) || this; - _this.keyType = keyType; - _this.valueType = valueType; - _this.options = options; - return _this; - } - MapTypeDescriptor.prototype.getTypes = function () { - return _super.prototype.getTypes.call(this).concat(this.keyType.getTypes(), this.valueType.getTypes()); - }; - MapTypeDescriptor.prototype.getCompleteOptions = function () { - var _a, _b; - return { - shape: (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.shape) !== null && _b !== void 0 ? _b : 0 /* ARRAY */, - }; - }; - return MapTypeDescriptor; -}(GenericTypeDescriptor)); - -function MapT(keyType, valueType, options) { - return new MapTypeDescriptor(ensureTypeDescriptor(keyType), ensureTypeDescriptor(valueType), options); -} -// TODO support for dictionary types ie. maps that are plain objects -// export class DictionaryTypeDescriptor extends GenericTypeDescriptor { -// constructor(public readonly elementType: TypeDescriptor) { -// super(Object); -// } -// -// getTypes(): Function[] { -// return super.getTypes().concat(this.elementType.getTypes()); -// } -// } -// -// export function DictT(elementType: Typelike): DictionaryTypeDescriptor { -// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); -// } -function isTypelike(type) { - return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); -} -function ensureTypeDescriptor(type) { - return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); -} - -// CONCATENATED MODULE: ./src/typedjson/deserializer.ts - - - - -function defaultTypeResolver(sourceObject, knownTypes) { - if (sourceObject.__type != null) { - return knownTypes.get(sourceObject.__type); - } -} -/** - * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. - * It is used after parsing a JSON-string. - */ -var deserializer_Deserializer = /** @class */ (function () { - function Deserializer() { - this.typeResolver = defaultTypeResolver; - this.errorHandler = logError; - this.deserializationStrategy = new Map([ - // primitives - [Number, deserializeDirectly], - [String, deserializeDirectly], - [Boolean, deserializeDirectly], - [Date, deserializeDate], - [ArrayBuffer, stringToArrayBuffer], - [DataView, stringToDataView], - [Array, convertAsArray], - [Set, convertAsSet], - [Map, convertAsMap], - // typed arrays - [Float32Array, convertAsFloatArray], - [Float64Array, convertAsFloatArray], - [Uint8Array, convertAsUintArray], - [Uint8ClampedArray, convertAsUintArray], - [Uint16Array, convertAsUintArray], - [Uint32Array, convertAsUintArray], - ]); - } - Deserializer.prototype.setNameResolver = function (nameResolverCallback) { - this.nameResolver = nameResolverCallback; - }; - Deserializer.prototype.setTypeResolver = function (typeResolverCallback) { - if (typeof typeResolverCallback !== 'function') { - throw new TypeError('\'typeResolverCallback\' is not a function.'); - } - this.typeResolver = typeResolverCallback; - }; - Deserializer.prototype.getTypeResolver = function () { - return this.typeResolver; - }; - Deserializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== 'function') { - throw new TypeError('\'errorHandlerCallback\' is not a function.'); - } - this.errorHandler = errorHandlerCallback; - }; - Deserializer.prototype.getErrorHandler = function () { - return this.errorHandler; - }; - Deserializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, knownTypes, memberName, memberOptions) { - if (memberName === void 0) { memberName = 'object'; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - return null; - } - else if (!isValueDefined(sourceObject)) { - return; - } - var deserializer = this.deserializationStrategy.get(typeDescriptor.ctor); - if (deserializer !== undefined) { - return deserializer(sourceObject, typeDescriptor, knownTypes, memberName, this, memberOptions); - } - if (typeof sourceObject === 'object') { - return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); - } - this.errorHandler(new TypeError("Could not deserialize '" + memberName + "': don't know how to deserialize this type'.")); - }; - Deserializer.prototype.instantiateType = function (ctor) { - return new ctor(); - }; - Deserializer.prototype.mergeKnownTypes = function () { - var _this = this; - var knownTypeMaps = []; - for (var _i = 0; _i < arguments.length; _i++) { - knownTypeMaps[_i] = arguments[_i]; - } - var result = new Map(); - knownTypeMaps.forEach(function (knownTypes) { - knownTypes.forEach(function (ctor, name) { - if (_this.nameResolver === undefined) { - result.set(name, ctor); - } - else { - result.set(_this.nameResolver(ctor), ctor); - } - }); - }); - return result; - }; - Deserializer.prototype.createKnownTypesMap = function (knowTypes) { - var _this = this; - var map = new Map(); - knowTypes.forEach(function (ctor) { - if (_this.nameResolver === undefined) { - var knownTypeMeta = metadata_JsonObjectMetadata.getFromConstructor(ctor); - var customName = (knownTypeMeta === null || knownTypeMeta === void 0 ? void 0 : knownTypeMeta.isExplicitlyMarked) === true - ? knownTypeMeta.name - : null; - map.set(customName !== null && customName !== void 0 ? customName : ctor.name, ctor); - } - else { - map.set(_this.nameResolver(ctor), ctor); - } - }); - return map; - }; - Deserializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - Deserializer.prototype.isExpectedMapShape = function (source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); - }; - return Deserializer; -}()); - -function throwTypeMismatchError(targetType, expectedSourceType, actualSourceType, memberName) { - throw new TypeError("Could not deserialize " + memberName + " as " + targetType + ":" - + (" expected " + expectedSourceType + ", got " + actualSourceType + ".")); -} -function makeTypeErrorMessage(expectedType, actualType, memberName) { - var expectedTypeName = typeof expectedType === 'function' - ? nameof(expectedType) - : expectedType; - var actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType; - return "Could not deserialize " + memberName + ": expected '" + expectedTypeName + "'," - + (" got '" + actualTypeName + "'."); -} -function srcTypeNameForDebug(sourceObject) { - return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor); -} -function deserializeDirectly(sourceObject, typeDescriptor, knownTypes, objectName) { - if (sourceObject.constructor !== typeDescriptor.ctor) { - throw new TypeError(makeTypeErrorMessage(nameof(typeDescriptor.ctor), sourceObject.constructor, objectName)); - } - return sourceObject; -} -function convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, deserializer) { - if (typeof sourceObject !== 'object' || sourceObject === null) { - deserializer.getErrorHandler()(new TypeError("Cannot deserialize " + memberName + ": 'sourceObject' must be a defined object.")); - return undefined; - } - var expectedSelfType = typeDescriptor.ctor; - var sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(expectedSelfType); - var knownTypeConstructors = knownTypes; - var typeResolver = deserializer.getTypeResolver(); - if (sourceObjectMetadata !== undefined) { - // Merge known types received from "above" with known types defined on the current type. - knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); - if (sourceObjectMetadata.typeResolver != null) { - typeResolver = sourceObjectMetadata.typeResolver; - } - } - // Check if a type-hint is available from the source object. - var typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors); - if (typeFromTypeHint != null) { - // Check if type hint is a valid subtype of the expected source type. - if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) { - // Hell yes. - expectedSelfType = typeFromTypeHint; - sourceObjectMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeFromTypeHint); - if (sourceObjectMetadata !== undefined) { - // Also merge new known types from subtype. - knownTypeConstructors = deserializer.mergeKnownTypes(knownTypeConstructors, deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes)); - } - } - } - if ((sourceObjectMetadata === null || sourceObjectMetadata === void 0 ? void 0 : sourceObjectMetadata.isExplicitlyMarked) === true) { - var sourceMetadata_1 = sourceObjectMetadata; - // Strong-typed deserialization available, get to it. - // First deserialize properties into a temporary object. - var sourceObjectWithDeserializedProperties_1 = {}; - var classOptions_1 = mergeOptions(deserializer.options, sourceMetadata_1.options); - // Deserialize by expected properties. - sourceMetadata_1.dataMembers.forEach(function (objMemberMetadata, propKey) { - var objMemberValue = sourceObject[propKey]; - var objMemberDebugName = nameof(sourceMetadata_1.classType) + "." + propKey; - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var revivedValue; - if (objMemberMetadata.deserializer != null) { - revivedValue = objMemberMetadata.deserializer(objMemberValue); - } - else if (objMemberMetadata.type == null) { - throw new TypeError("Cannot deserialize " + objMemberDebugName + " there is" - + " no constructor nor deserialization function to use."); - } - else { - revivedValue = deserializer.convertSingleValue(objMemberValue, objMemberMetadata.type, knownTypeConstructors, objMemberDebugName, objMemberOptions); - } - // @todo revivedValue will never be null in RHS of || - if (isValueDefined(revivedValue) - || (deserializer.retrievePreserveNull(objMemberOptions) - && revivedValue === null)) { - sourceObjectWithDeserializedProperties_1[objMemberMetadata.key] = revivedValue; - } - else if (objMemberMetadata.isRequired === true) { - deserializer.getErrorHandler()(new TypeError("Missing required member '" + objMemberDebugName + "'.")); - } - }); - // Next, instantiate target object. - var targetObject = void 0; - if (typeof sourceObjectMetadata.initializerCallback === 'function') { - try { - targetObject = sourceObjectMetadata.initializerCallback(sourceObjectWithDeserializedProperties_1, sourceObject); - // Check the validity of user-defined initializer callback. - if (targetObject == null) { - throw new TypeError("Cannot deserialize " + memberName + ":" - + " 'initializer' function returned undefined/null" - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected.")); - } - else if (!(targetObject instanceof sourceObjectMetadata.classType)) { - throw new TypeError("Cannot deserialize " + memberName + ":" - + ("'initializer' returned '" + nameof(targetObject.constructor) + "'") - + (", but '" + nameof(sourceObjectMetadata.classType) + "' was expected") - + (", and '" + nameof(targetObject.constructor) + "' is not a subtype of") - + (" '" + nameof(sourceObjectMetadata.classType) + "'")); - } - } - catch (e) { - deserializer.getErrorHandler()(e); - return undefined; - } - } - else { - targetObject = deserializer.instantiateType(expectedSelfType); - } - // Finally, assign deserialized properties to target object. - Object.assign(targetObject, sourceObjectWithDeserializedProperties_1); - // Call onDeserialized method (if any). - var methodName = sourceObjectMetadata.onDeserializedMethodName; - if (methodName != null) { - if (typeof targetObject[methodName] === 'function') { - // check for member first - targetObject[methodName](); - } - else if (typeof targetObject.constructor[methodName] === 'function') { - // check for static - targetObject.constructor[methodName](); - } - else { - deserializer.getErrorHandler()(new TypeError("onDeserialized callback" - + ("'" + nameof(sourceObjectMetadata.classType) + "." + methodName + "' is not a method."))); - } - } - return targetObject; - } - else { - // Untyped deserialization into Object instance. - var targetObject_1 = {}; - Object.keys(sourceObject).forEach(function (sourceKey) { - targetObject_1[sourceKey] = deserializer.convertSingleValue(sourceObject[sourceKey], new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor), knownTypes, sourceKey); - }); - return targetObject_1; - } -} -function convertAsArray(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Array: incorrect TypeDescriptor detected," - + ' please use proper annotation or function for this type'); - } - if (!Array.isArray(sourceObject)) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return []; - } - if (typeDescriptor.elementType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Array: missing constructor reference of" - + " Array elements.")); - return []; - } - return sourceObject.map(function (element, i) { - // If an array element fails to deserialize, substitute with undefined. This is so that the - // original ordering is not interrupted by faulty - // entries, as an Array is ordered. - try { - return deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions); - } - catch (e) { - deserializer.getErrorHandler()(e); - // Keep filling the array here with undefined to keep original ordering. - // Note: this is just aesthetics, not returning anything produces the same result. - return undefined; - } - }); -} -function convertAsSet(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Set: incorrect TypeDescriptor detected," - + " please use proper annotation or function for this type"); - } - if (!Array.isArray(sourceObject)) { - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName))); - return new Set(); - } - if (typeDescriptor.elementType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Set: missing constructor reference of" - + " Set elements.")); - return new Set(); - } - var resultSet = new Set(); - sourceObject.forEach(function (element, i) { - try { - resultSet.add(deserializer.convertSingleValue(element, typeDescriptor.elementType, knownTypes, memberName + "[" + i + "]", memberOptions)); - } - catch (e) { - // Faulty entries are skipped, because a Set is not ordered, and skipping an entry - // does not affect others. - deserializer.getErrorHandler()(e); - } - }); - return resultSet; -} -function isExpectedMapShape(source, expectedShape) { - return (expectedShape === 0 /* ARRAY */ && Array.isArray(source)) - || (expectedShape === 1 /* OBJECT */ && typeof source === 'object'); -} -function convertAsMap(sourceObject, typeDescriptor, knownTypes, memberName, deserializer, memberOptions) { - if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not deserialize " + memberName + " as Map: incorrect TypeDescriptor detected," - + 'please use proper annotation or function for this type'); - } - var expectedShape = typeDescriptor.getCompleteOptions().shape; - if (!isExpectedMapShape(sourceObject, expectedShape)) { - var expectedType = expectedShape === 0 /* ARRAY */ ? Array : Object; - deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName))); - return new Map(); - } - if (typeDescriptor.keyType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing key constructor.")); - return new Map(); - } - if (typeDescriptor.valueType == null) { - deserializer.getErrorHandler()(new TypeError("Could not deserialize " + memberName + " as Map: missing value constructor.")); - return new Map(); - } - var keyMemberName = memberName + "[].key"; - var valueMemberName = memberName + "[].value"; - var resultMap = new Map(); - if (expectedShape === 1 /* OBJECT */) { - Object.keys(sourceObject).forEach(function (key) { - try { - var resultKey = deserializer.convertSingleValue(key, typeDescriptor.keyType, knownTypes, keyMemberName, memberOptions); - if (isValueDefined(resultKey)) { - resultMap.set(resultKey, deserializer.convertSingleValue(sourceObject[key], typeDescriptor.valueType, knownTypes, valueMemberName, memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); - } - }); - } - else { - sourceObject.forEach(function (element) { - try { - var key = deserializer.convertSingleValue(element.key, typeDescriptor.keyType, knownTypes, keyMemberName, memberOptions); - // Undefined/null keys not supported, skip if so. - if (isValueDefined(key)) { - resultMap.set(key, deserializer.convertSingleValue(element.value, typeDescriptor.valueType, knownTypes, valueMemberName, memberOptions)); - } - } - catch (e) { - // Faulty entries are skipped, because a Map is not ordered, - // and skipping an entry does not affect others. - deserializer.getErrorHandler()(e); - } - }); - } - return resultMap; -} -function deserializeDate(sourceObject, typeDescriptor, knownTypes, memberName) { - // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since - // the Epoch). - // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime - if (typeof sourceObject === 'string' - || (typeof sourceObject === 'number' && sourceObject > 0)) { - return new Date(sourceObject); - } - else if (sourceObject instanceof Date) { - return sourceObject; - } - else { - throwTypeMismatchError('Date', 'an ISO-8601 string', srcTypeNameForDebug(sourceObject), memberName); - } -} -function stringToArrayBuffer(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== 'string') { - throwTypeMismatchError('ArrayBuffer', 'a string source', srcTypeNameForDebug(sourceObject), memberName); - } - return createArrayBufferFromString(sourceObject); -} -function stringToDataView(sourceObject, typeDescriptor, knownTypes, memberName) { - if (typeof sourceObject !== 'string') { - throwTypeMismatchError('DataView', 'a string source', srcTypeNameForDebug(sourceObject), memberName); - } - return new DataView(createArrayBufferFromString(sourceObject)); -} -function createArrayBufferFromString(input) { - var buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char - var bufView = new Uint16Array(buf); - for (var i = 0, strLen = input.length; i < strLen; i++) { - bufView[i] = input.charCodeAt(i); - } - return buf; -} -function convertAsFloatArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - return new constructor(sourceObject); - } - return throwTypeMismatchError(constructor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); -} -// @todo: investigate bitwise and types -function convertAsUintArray(sourceObject, typeDescriptor, knownTypes, memberName) { - var constructor = typeDescriptor.ctor; - if (Array.isArray(sourceObject) && sourceObject.every(function (elem) { return !isNaN(elem); })) { - // eslint-disable-next-line no-bitwise - return new constructor(sourceObject.map(function (value) { return ~~value; })); - } - return throwTypeMismatchError(typeDescriptor.ctor.name, 'a numeric source array', srcTypeNameForDebug(sourceObject), memberName); -} - -// CONCATENATED MODULE: ./src/typedjson/json-array-member.ts - - - - -/** - * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' - * for 'Date[]'). - * @param options Additional options. - */ -function jsonArrayMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - var decoratorName = "@jsonArrayMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(elementConstructor)) { - logError(decoratorName + ": could not resolve constructor of array elements at runtime."); - return; - } - var dimensions = options.dimensions == null ? 1 : options.dimensions; - if (!isNaN(dimensions) && dimensions < 1) { - logError(decoratorName + ": 'dimensions' option must be at least 1."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been - // used on an array. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Array) { - logError(decoratorName + ": property is not an Array. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} -function createArrayType(elementType, dimensions) { - var type = new ArrayTypeDescriptor(elementType); - for (var i = 1; i < dimensions; ++i) { - type = new ArrayTypeDescriptor(type); - } - return type; -} - -// CONCATENATED MODULE: ./src/typedjson/serializer.ts -var serializer_assign = (undefined && undefined.__assign) || function () { - serializer_assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return serializer_assign.apply(this, arguments); -}; - - - - -function defaultTypeEmitter(targetObject, sourceObject, expectedSourceType, sourceTypeMetadata) { - var _a; - // 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 will know what to deserialize into (given - // the required known-types are defined, and the object is a valid subtype of the expected - // type). - if (sourceObject.constructor !== expectedSourceType) { - targetObject.__type = (_a = sourceTypeMetadata === null || sourceTypeMetadata === void 0 ? void 0 : sourceTypeMetadata.name) !== null && _a !== void 0 ? _a : nameof(sourceObject.constructor); - } -} -/** - * 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 called "simple javascript object"), - * and emits any necessary type hints in the process (for polymorphism). - * - * 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: - * - * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string - */ -var serializer_Serializer = /** @class */ (function () { - function Serializer() { - this.typeHintEmitter = defaultTypeEmitter; - this.errorHandler = logError; - this.serializationStrategy = new Map([ - // primitives - [Date, identity], - [Number, identity], - [String, identity], - [Boolean, identity], - [ArrayBuffer, convertAsArrayBuffer], - [DataView, convertAsDataView], - [Array, serializer_convertAsArray], - [Set, serializer_convertAsSet], - [Map, serializer_convertAsMap], - // typed arrays - [Float32Array, convertAsTypedArray], - [Float64Array, convertAsTypedArray], - [Int8Array, convertAsTypedArray], - [Uint8Array, convertAsTypedArray], - [Uint8ClampedArray, convertAsTypedArray], - [Int16Array, convertAsTypedArray], - [Uint16Array, convertAsTypedArray], - [Int32Array, convertAsTypedArray], - [Uint32Array, convertAsTypedArray], - ]); - } - Serializer.prototype.setTypeHintEmitter = function (typeEmitterCallback) { - if (typeof typeEmitterCallback !== 'function') { - throw new TypeError('\'typeEmitterCallback\' is not a function.'); - } - this.typeHintEmitter = typeEmitterCallback; - }; - Serializer.prototype.getTypeHintEmitter = function () { - return this.typeHintEmitter; - }; - Serializer.prototype.setErrorHandler = function (errorHandlerCallback) { - if (typeof errorHandlerCallback !== 'function') { - throw new TypeError('\'errorHandlerCallback\' is not a function.'); - } - this.errorHandler = errorHandlerCallback; - }; - Serializer.prototype.getErrorHandler = function () { - return this.errorHandler; - }; - Serializer.prototype.retrievePreserveNull = function (memberOptions) { - return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); - }; - /** - * Convert a value of any supported serializable type. - * The value type will be detected, and the correct serialization method will be called. - */ - Serializer.prototype.convertSingleValue = function (sourceObject, typeDescriptor, memberName, memberOptions) { - if (memberName === void 0) { memberName = 'object'; } - if (this.retrievePreserveNull(memberOptions) && sourceObject === null) { - return null; - } - if (!isValueDefined(sourceObject)) { - return; - } - if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) { - var expectedName = nameof(typeDescriptor.ctor); - var actualName = nameof(sourceObject.constructor); - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': expected '" + expectedName + "'," - + (" got '" + actualName + "'."))); - return; - } - var serializer = this.serializationStrategy.get(typeDescriptor.ctor); - if (serializer !== undefined) { - return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions); - } - // if not present in the strategy do property by property serialization - if (typeof sourceObject === 'object') { - return serializer_convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); - } - this.errorHandler(new TypeError("Could not serialize '" + memberName + "': don't know how to serialize this type'.")); - }; - return Serializer; -}()); - -/** - * Performs the conversion of a typed object (usually a class instance) to a simple - * javascript object for serialization. - */ -function serializer_convertAsObject(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - var sourceTypeMetadata; - var targetObject; - var typeHintEmitter = serializer.getTypeHintEmitter(); - if (sourceObject.constructor !== typeDescriptor.ctor - && sourceObject instanceof typeDescriptor.ctor) { - // The source object is not of the expected type, but it is a valid subtype. - // This is OK, and we'll proceed to gather object metadata from the subtype instead. - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(sourceObject.constructor); - } - else { - sourceTypeMetadata = metadata_JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor); - } - if (sourceTypeMetadata === undefined) { - // Untyped serialization, "as-is", we'll just pass the object on. - // 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. - targetObject = serializer_assign({}, sourceObject); - } - else { - var beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName; - if (beforeSerializationMethodName != null) { - if (typeof sourceObject[beforeSerializationMethodName] === 'function') { - // check for member first - sourceObject[beforeSerializationMethodName](); - } - else if (typeof sourceObject.constructor[beforeSerializationMethodName] - === 'function') { - // check for static - sourceObject.constructor[beforeSerializationMethodName](); - } - else { - serializer.getErrorHandler()(new TypeError("beforeSerialization callback '" - + (nameof(sourceTypeMetadata.classType) + "." + beforeSerializationMethodName) - + "' is not a method.")); - } - } - var sourceMeta_1 = sourceTypeMetadata; - // Strong-typed serialization available. - // We'll serialize by members that have been marked with @jsonMember (including - // array/set/map members), and perform recursive conversion on each of them. The converted - // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' - // finally. - targetObject = {}; - var classOptions_1 = mergeOptions(serializer.options, sourceMeta_1.options); - if (sourceMeta_1.typeHintEmitter != null) { - typeHintEmitter = sourceMeta_1.typeHintEmitter; - } - sourceMeta_1.dataMembers.forEach(function (objMemberMetadata) { - var objMemberOptions = mergeOptions(classOptions_1, objMemberMetadata.options); - var serialized; - if (objMemberMetadata.serializer != null) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); - } - else if (objMemberMetadata.type == null) { - throw new TypeError("Could not serialize " + objMemberMetadata.name + ", there is" - + " no constructor nor serialization function to use."); - } - else { - serialized = serializer.convertSingleValue(sourceObject[objMemberMetadata.key], objMemberMetadata.type, nameof(sourceMeta_1.classType) + "." + objMemberMetadata.key, objMemberOptions); - } - if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null) - || isValueDefined(serialized)) { - targetObject[objMemberMetadata.name] = serialized; - } - }); - } - // Add type-hint. - typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, sourceTypeMetadata); - return targetObject; -} -/** - * Performs the conversion of an array of typed objects (or primitive values) to an array of simple - * javascript objects - * (or primitive values) for serialization. - */ -function serializer_convertAsArray(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Array: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.elementType == null) { - throw new TypeError("Could not serialize " + memberName + " as Array: missing element type definition."); - } - // Check the type of each element, individually. - // If at least one array element type is incorrect, we return undefined, which results in no - // value emitted during serialization. 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 - // the emitted array. - sourceObject.forEach(function (element, i) { - if (!(serializer.retrievePreserveNull(memberOptions) && element === null) - && !isInstanceOf(element, typeDescriptor.elementType.ctor)) { - var expectedTypeName = nameof(typeDescriptor.elementType.ctor); - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - var actualTypeName = element && nameof(element.constructor); - throw new TypeError("Could not serialize " + memberName + "[" + i + "]:" - + (" expected '" + expectedTypeName + "', got '" + actualTypeName + "'.")); - } - }); - return sourceObject.map(function (element, i) { - return serializer.convertSingleValue(element, typeDescriptor.elementType, memberName + "[" + i + "]", memberOptions); - }); -} -/** - * Performs the conversion of a set of typed objects (or primitive values) into an array - * of simple javascript objects. - * @returns - */ -function serializer_convertAsSet(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof SetTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Set: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.elementType == null) { - throw new TypeError("Could not serialize " + memberName + " as Set: missing element type definition."); - } - memberName += '[]'; - var resultArray = []; - // Convert each element of the set, and put it into an output array. - // The output array is the one serialized, as JSON.stringify does not support Set serialization. - // (TODO: clarification needed) - sourceObject.forEach(function (element) { - var resultElement = serializer.convertSingleValue(element, typeDescriptor.elementType, memberName, memberOptions); - // Add to output if the source element was undefined, OR the converted element is defined. - // This will add intentionally undefined values to output, but not values that became - // undefined DURING serializing (usually because of a type-error). - if (!isValueDefined(element) || isValueDefined(resultElement)) { - resultArray.push(resultElement); - } - }); - return resultArray; -} -/** - * Performs the conversion of a map of typed objects (or primitive values) into an array - * of simple javascript objects with `key` and `value` properties. - */ -function serializer_convertAsMap(sourceObject, typeDescriptor, memberName, serializer, memberOptions) { - if (!(typeDescriptor instanceof MapTypeDescriptor)) { - throw new TypeError("Could not serialize " + memberName + " as Map: incorrect TypeDescriptor detected, please" - + ' use proper annotation or function for this type'); - } - if (typeDescriptor.valueType == null) { // @todo Check type - throw new TypeError("Could not serialize " + memberName + " as Map: missing value type definition."); - } - if (typeDescriptor.keyType == null) { // @todo Check type - throw new TypeError("Could not serialize " + memberName + " as Map: missing key type definition."); - } - var keyMemberName = memberName + "[].key"; - var valueMemberName = memberName + "[].value"; - var resultShape = typeDescriptor.getCompleteOptions().shape; - var result = resultShape === 1 /* OBJECT */ ? {} : []; - var preserveNull = serializer.retrievePreserveNull(memberOptions); - // Convert each *entry* in the map to a simple javascript object with key and value properties. - sourceObject.forEach(function (value, key) { - var resultKeyValuePairObj = { - key: serializer.convertSingleValue(key, typeDescriptor.keyType, keyMemberName, memberOptions), - value: serializer.convertSingleValue(value, typeDescriptor.valueType, valueMemberName, memberOptions), - }; - // We are not going to emit entries with undefined keys OR undefined values. - var keyDefined = isValueDefined(resultKeyValuePairObj.key); - var valueDefined = (resultKeyValuePairObj.value === null && preserveNull) - || isValueDefined(resultKeyValuePairObj.value); - if (keyDefined && valueDefined) { - if (resultShape === 1 /* OBJECT */) { - result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value; - } - else { - result.push(resultKeyValuePairObj); - } - } - }); - return result; -} -/** - * Performs the conversion of a typed javascript array to a simple untyped javascript array. - * This is needed because typed arrays are otherwise serialized as objects, so we'll end up - * with something like "{ 0: 0, 1: 1, ... }". - */ -function convertAsTypedArray(sourceObject) { - return Array.from(sourceObject); -} -/** - * Performs the conversion of a raw ArrayBuffer to a string. - */ -function convertAsArrayBuffer(buffer) { - // ArrayBuffer -> 16-bit character codes -> character array -> joined string. - return Array.from(new Uint16Array(buffer)) - .map(function (charCode) { return String.fromCharCode(charCode); }).join(''); -} -/** - * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and - * returning that string. - */ -function convertAsDataView(dataView) { - return convertAsArrayBuffer(dataView.buffer); -} - -// CONCATENATED MODULE: ./src/parser.ts -var parser_assign = (undefined && undefined.__assign) || function () { - parser_assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return parser_assign.apply(this, arguments); -}; - - - - - - - - -var parser_TypedJSON = /** @class */ (function () { - /** - * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object - * instances of the specified root class type. - * @param rootConstructor The constructor of the root class type. - * @param settings Additional configuration settings. - */ - function TypedJSON(rootConstructor, settings) { - this.serializer = new serializer_Serializer(); - this.deserializer = new deserializer_Deserializer(); - this.globalKnownTypes = []; - this.indent = 0; - var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(rootConstructor); - if (rootMetadata === undefined - || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) { - throw new TypeError('The TypedJSON root data type must have the @jsonObject decorator used.'); - } - this.nameResolver = function (ctor) { return nameof(ctor); }; - this.rootConstructor = rootConstructor; - this.errorHandler = function (error) { return logError(error); }; - if (settings !== undefined) { - this.config(settings); - } - else if (TypedJSON._globalConfig !== undefined) { - this.config({}); - } - } - TypedJSON.parse = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).parse(object); - }; - TypedJSON.parseAsArray = function (object, elementType, settings, dimensions) { - return new TypedJSON(elementType, settings).parseAsArray(object, dimensions); - }; - TypedJSON.parseAsSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).parseAsSet(object); - }; - TypedJSON.parseAsMap = function (object, keyType, valueType, settings) { - return new TypedJSON(valueType, settings).parseAsMap(object, keyType); - }; - TypedJSON.toPlainJson = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).toPlainJson(object); - }; - TypedJSON.toPlainArray = function (object, elementType, dimensions, settings) { - return new TypedJSON(elementType, settings).toPlainArray(object, dimensions); - }; - TypedJSON.toPlainSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).toPlainSet(object); - }; - TypedJSON.toPlainMap = function (object, keyCtor, valueCtor, settings) { - return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor); - }; - TypedJSON.stringify = function (object, rootType, settings) { - return new TypedJSON(rootType, settings).stringify(object); - }; - TypedJSON.stringifyAsArray = function (object, elementType, dimensions, settings) { - return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions); - }; - TypedJSON.stringifyAsSet = function (object, elementType, settings) { - return new TypedJSON(elementType, settings).stringifyAsSet(object); - }; - TypedJSON.stringifyAsMap = function (object, keyCtor, valueCtor, settings) { - return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor); - }; - TypedJSON.setGlobalConfig = function (config) { - if (this._globalConfig == null) { - this._globalConfig = config; - } - else { - Object.assign(this._globalConfig, config); - } - }; - /** - * Configures TypedJSON through a settings object. - * @param settings The configuration settings object. - */ - TypedJSON.prototype.config = function (settings) { - if (TypedJSON._globalConfig != null) { - settings = parser_assign(parser_assign({}, TypedJSON._globalConfig), settings); - if (settings.knownTypes != null - && TypedJSON._globalConfig.knownTypes != null) { - // Merge known-types (also de-duplicate them, so Array -> Set -> Array). - settings.knownTypes = Array.from(new Set(settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes))); - } - } - var options = extractOptionBase(settings); - this.serializer.options = options; - this.deserializer.options = options; - if (settings.errorHandler != null) { - this.errorHandler = settings.errorHandler; - this.deserializer.setErrorHandler(settings.errorHandler); - this.serializer.setErrorHandler(settings.errorHandler); - } - if (settings.replacer != null) { - this.replacer = settings.replacer; - } - if (settings.typeResolver != null) { - this.deserializer.setTypeResolver(settings.typeResolver); - } - if (settings.typeHintEmitter != null) { - this.serializer.setTypeHintEmitter(settings.typeHintEmitter); - } - if (settings.indent != null) { - this.indent = settings.indent; - } - if (settings.nameResolver != null) { - this.nameResolver = settings.nameResolver; - this.deserializer.setNameResolver(settings.nameResolver); - } - if (settings.knownTypes != null) { - // Type-check knownTypes elements to recognize errors in advance. - settings.knownTypes.forEach(function (knownType, i) { - if (typeof knownType === 'undefined' || knownType === null) { - logWarning("TypedJSON.config: 'knownTypes' contains an undefined/null value" - + (" (element " + i + ").")); - } - }); - this.globalKnownTypes = settings.knownTypes; - } - }; - /** - * Converts a JSON string to the root class type. - * @param object The JSON to parse and convert. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns Deserialized T or undefined if there were errors. - */ - TypedJSON.prototype.parse = function (object) { - var _this = this; - var json = parseToJSObject(object, this.rootConstructor); - var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(this.rootConstructor); - var result; - var knownTypes = new Map(); - this.globalKnownTypes.filter(function (ktc) { return ktc; }).forEach(function (knownTypeCtor) { - knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - if (rootMetadata !== undefined) { - rootMetadata.knownTypes.forEach(function (knownTypeCtor) { - knownTypes.set(_this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - } - try { - result = this.deserializer.convertSingleValue(json, ensureTypeDescriptor(this.rootConstructor), knownTypes); - } - catch (e) { - this.errorHandler(e); - } - return result; - }; - TypedJSON.prototype.parseAsArray = function (object, dimensions) { - if (dimensions === void 0) { dimensions = 1; } - var json = parseToJSObject(object, Array); - return this.deserializer.convertSingleValue(json, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions), this._mapKnownTypes(this.globalKnownTypes)); - }; - TypedJSON.prototype.parseAsSet = function (object) { - var json = parseToJSObject(object, Set); - return this.deserializer.convertSingleValue(json, SetT(this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); - }; - TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { - var json = parseToJSObject(object, Map); - return this.deserializer.convertSingleValue(json, MapT(keyConstructor, this.rootConstructor), this._mapKnownTypes(this.globalKnownTypes)); - }; - /** - * Converts an instance of the specified class type to a plain JSON object. - * @param object The instance to convert to a JSON string. - * @returns Serialized object or undefined if an error has occured. - */ - TypedJSON.prototype.toPlainJson = function (object) { - try { - return this.serializer.convertSingleValue(object, ensureTypeDescriptor(this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainArray = function (object, dimensions) { - if (dimensions === void 0) { dimensions = 1; } - try { - return this.serializer.convertSingleValue(object, createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainSet = function (object) { - try { - return this.serializer.convertSingleValue(object, SetT(this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - TypedJSON.prototype.toPlainMap = function (object, keyConstructor) { - try { - return this.serializer.convertSingleValue(object, MapT(keyConstructor, this.rootConstructor)); - } - catch (e) { - this.errorHandler(e); - } - }; - /** - * Converts an instance of the specified class type to a JSON string. - * @param object The instance to convert to a JSON string. - * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown). - * @returns String with the serialized object or an empty string if an error has occured, but - * the errorHandler did not throw. - */ - TypedJSON.prototype.stringify = function (object) { - var result = this.toPlainJson(object); - if (result === undefined) { - return ''; - } - return JSON.stringify(result, this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsArray = function (object, dimensions) { - return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsSet = function (object) { - return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent); - }; - TypedJSON.prototype.stringifyAsMap = function (object, keyConstructor) { - return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); - }; - TypedJSON.prototype._mapKnownTypes = function (constructors) { - var _this = this; - var map = new Map(); - constructors.filter(function (ctor) { return ctor; }).forEach(function (ctor) { return map.set(_this.nameResolver(ctor), ctor); }); - return map; - }; - return TypedJSON; -}()); - - -// CONCATENATED MODULE: ./src/typedjson/json-object.ts - - -function jsonObject(optionsOrTarget) { - var options; - if (typeof optionsOrTarget === 'function') { - // jsonObject is being used as a decorator, directly. - options = {}; - } - else { - // jsonObject is being used as a decorator factory. - options = optionsOrTarget !== null && optionsOrTarget !== void 0 ? optionsOrTarget : {}; - } - function decorator(target) { - // Create or obtain JsonObjectMetadata object. - var objectMetadata = metadata_JsonObjectMetadata.ensurePresentInPrototype(target.prototype); - // Fill JsonObjectMetadata. - objectMetadata.isExplicitlyMarked = true; - objectMetadata.onDeserializedMethodName = options.onDeserialized; - objectMetadata.beforeSerializationMethodName = options.beforeSerialization; - if (options.typeResolver != null) { - objectMetadata.typeResolver = options.typeResolver; - } - if (options.typeHintEmitter != null) { - objectMetadata.typeHintEmitter = options.typeHintEmitter; - } - // T extend Object so it is fine - objectMetadata.initializerCallback = options.initializer; - if (options.name != null) { - objectMetadata.name = options.name; - } - var optionsBase = extractOptionBase(options); - if (optionsBase !== undefined) { - objectMetadata.options = optionsBase; - } - if (options.knownTypes != null) { - options.knownTypes - .filter(function (knownType) { return Boolean(knownType); }) - .forEach(function (knownType) { return objectMetadata.knownTypes.add(knownType); }); - } - } - if (typeof optionsOrTarget === 'function') { - // jsonObject is being used as a decorator, directly. - decorator(optionsOrTarget); - } - else { - // jsonObject is being used as a decorator factory. - return decorator; - } -} -function isSubClass(target) { - return; -} - -// CONCATENATED MODULE: ./src/typedjson/json-member.ts - - - - -function jsonMember(optionsOrPrototype, propKey) { - // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string - // The check is not required. - if (propKey !== undefined - && (typeof propKey === 'string' || typeof propKey === 'symbol')) { - var prototype = optionsOrPrototype; - // For error messages. - var decoratorName = "@jsonMember on " + nameof(prototype.constructor) + "." + String(propKey); - // jsonMember used directly, no additional information directly available besides target and - // propKey. - // Obtain property constructor through ReflectDecorators. - if (!isReflectMetadataSupported) { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option is" - + " specified."); - return; - } - var reflectPropCtor = Reflect.getMetadata('design:type', prototype, propKey); - if (reflectPropCtor == null) { - logError(decoratorName + ": could not resolve detected property constructor at runtime." + MISSING_REFLECT_CONF_MSG); - return; - } - var typeDescriptor = ensureTypeDescriptor(reflectPropCtor); - if (isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(prototype, propKey, { - type: typeDescriptor, - key: propKey.toString(), - name: propKey.toString(), - }); - } - else { - // jsonMember used as a decorator factory. - return function (target, _propKey) { - var _a, _b; - var options = (_a = optionsOrPrototype) !== null && _a !== void 0 ? _a : {}; - var typeDescriptor; - var decoratorName = "@jsonMember on " + nameof(target.constructor) + "." + String(_propKey); - if (options.hasOwnProperty('constructor')) { - if (!isValueDefined(options.constructor)) { - logError(decoratorName + ": cannot resolve specified property constructor at" - + ' runtime.'); - return; - } - // Property constructor has been specified. Use ReflectDecorators (if available) to - // check whether that constructor is correct. Warn if not. - typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf(typeDescriptor.ctor, Reflect.getMetadata('design:type', target, _propKey))) { - logWarning(decoratorName + ": detected property type does not match" - + " 'constructor' option."); - } - } - else if (isReflectMetadataSupported) { - var reflectCtor = Reflect.getMetadata('design:type', target, _propKey); - if (reflectCtor == null) { - logError(decoratorName + ": cannot resolve detected property constructor at" - + " runtime."); - return; - } - typeDescriptor = ensureTypeDescriptor(reflectCtor); - } - else if (options.deserializer === undefined) { - logError(decoratorName + ": ReflectDecorators is required if no 'constructor' option" - + " is specified."); - return; - } - if (typeDescriptor !== undefined - && isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(target, _propKey, { - type: typeDescriptor, - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: _propKey.toString(), - name: (_b = options.name) !== null && _b !== void 0 ? _b : _propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; - } -} -function isSpecialPropertyType(decoratorName, typeDescriptor) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { - logError(decoratorName + ": property is an Array. Use the jsonArrayMember decorator to" - + " serialize this property."); - return true; - } - if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { - logError(decoratorName + ": property is a Set. Use the jsonSetMember decorator to" - + " serialize this property."); - return true; - } - if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { - logError(decoratorName + ": property is a Map. Use the jsonMapMember decorator to" - + " serialize this property."); - return true; - } - return false; -} - -// CONCATENATED MODULE: ./src/typedjson/json-set-member.ts - - - - -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' - * for Set). - * @param options Additional options. - */ -function jsonSetMember(elementConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - // For error messages - var decoratorName = "@jsonSetMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(elementConstructor)) { - logError(decoratorName + ": could not resolve constructor of set elements at runtime."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used - // on a set. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Set) { - logError(decoratorName + ": property is not a Set. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: SetT(elementConstructor), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} - -// CONCATENATED MODULE: ./src/typedjson/json-map-member.ts - - - - -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Map. - * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map'). - * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). - * @param options Additional options. - */ -function jsonMapMember(keyConstructor, valueConstructor, options) { - if (options === void 0) { options = {}; } - return function (target, propKey) { - var _a; - // For error messages - var decoratorName = "@jsonMapMember on " + nameof(target.constructor) + "." + String(propKey); - if (!isTypelike(keyConstructor)) { - logError(decoratorName + ": could not resolve constructor of map keys at runtime."); - return; - } - if (!isTypelike(valueConstructor)) { - logError(decoratorName + ": could not resolve constructor of map values at runtime."); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used - // on a map. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Map) { - logError(decoratorName + ": property is not a Map. " + MISSING_REFLECT_CONF_MSG); - return; - } - injectMetadataInformation(target, propKey, { - type: MapT(keyConstructor, valueConstructor, { shape: options.shape }), - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: propKey.toString(), - name: (_a = options.name) !== null && _a !== void 0 ? _a : propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; -} - -// CONCATENATED MODULE: ./src/typedjson/to-json.ts - -function toJson(optionsOrTarget) { - if (typeof optionsOrTarget === 'function') { - // used directly - toJsonDecorator(optionsOrTarget, {}); - return; - } - // used as a factory - return function (target) { - toJsonDecorator(target, optionsOrTarget); - }; -} -function toJsonDecorator(target, options) { - if (options.overwrite !== true && target.prototype.toJSON !== undefined) { - throw new Error(target.name + " already has toJSON defined!"); - } - target.prototype.toJSON = function toJSON() { - return parser_TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor); - }; -} - -// CONCATENATED MODULE: ./src/typedjson.ts -/* concated harmony reexport TypedJSON */__webpack_require__.d(__webpack_exports__, "TypedJSON", function() { return parser_TypedJSON; }); -/* concated harmony reexport defaultTypeResolver */__webpack_require__.d(__webpack_exports__, "defaultTypeResolver", function() { return defaultTypeResolver; }); -/* concated harmony reexport defaultTypeEmitter */__webpack_require__.d(__webpack_exports__, "defaultTypeEmitter", function() { return defaultTypeEmitter; }); -/* concated harmony reexport JsonObjectMetadata */__webpack_require__.d(__webpack_exports__, "JsonObjectMetadata", function() { return metadata_JsonObjectMetadata; }); -/* concated harmony reexport jsonObject */__webpack_require__.d(__webpack_exports__, "jsonObject", function() { return jsonObject; }); -/* concated harmony reexport jsonMember */__webpack_require__.d(__webpack_exports__, "jsonMember", function() { return jsonMember; }); -/* concated harmony reexport jsonArrayMember */__webpack_require__.d(__webpack_exports__, "jsonArrayMember", function() { return jsonArrayMember; }); -/* concated harmony reexport jsonSetMember */__webpack_require__.d(__webpack_exports__, "jsonSetMember", function() { return jsonSetMember; }); -/* concated harmony reexport jsonMapMember */__webpack_require__.d(__webpack_exports__, "jsonMapMember", function() { return jsonMapMember; }); -/* concated harmony reexport toJson */__webpack_require__.d(__webpack_exports__, "toJson", function() { return toJson; }); -/* concated harmony reexport ArrayT */__webpack_require__.d(__webpack_exports__, "ArrayT", function() { return ArrayT; }); -/* concated harmony reexport SetT */__webpack_require__.d(__webpack_exports__, "SetT", function() { return SetT; }); -/* concated harmony reexport MapT */__webpack_require__.d(__webpack_exports__, "MapT", function() { return MapT; }); - - - - - - - - - - - -/***/ }) -/******/ ]); -}); -//# sourceMappingURL=typedjson.js.map \ No newline at end of file diff --git a/js/typedjson.js.map b/js/typedjson.js.map deleted file mode 100644 index cc84176..0000000 --- a/js/typedjson.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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/options-base.ts","webpack://typedjson/./src/typedjson/type-descriptor.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/parser.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson/to-json.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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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","import {Serializable} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both \"experimentalDecorators\"'\n + ' and \"emitDecoratorMetadata\" in your tsconfig.json?';\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into\n * `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number`\n * for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean {\n return [Date, Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isDirectlyDeserializableNativeType(type: Function): boolean {\n return [Number, String, Boolean].indexOf(type as any) !== -1;\n}\n\nexport function isTypeTypedArray(type: Function): boolean {\n return [\n Float32Array,\n Float64Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n ].indexOf(type as any) !== -1;\n}\n\nexport function isObject(value: any): value is Object {\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\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map((element, i) => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map((element, i) => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n `${memberName}[${i}]`,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n memberName += '[]';\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach((element) => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n keyMemberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n valueMemberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js deleted file mode 100644 index bdf3d5a..0000000 --- a/js/typedjson.min.js +++ /dev/null @@ -1,3 +0,0 @@ -// [typedjson] Version: 1.6.0-rc2 - 2020-08-30 - !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 n={},o.m=t=[function(e,r,t){"use strict";t.r(r);var n=function(){for(var e=0,r=0,t=arguments.length;r= 2\n && jsonStr[0] === '\"'\n && jsonStr[jsonStr.length - 1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes)\n || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Serializable): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) {\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 return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.error as any === 'function') {\n console.error(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`ERROR: ${message}`, ...optionalParams);\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(message, ...optionalParams);\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: Array) {\n if (typeof console as any === 'object' && typeof console.warn as any === 'function') {\n console.warn(message, ...optionalParams);\n } else if (typeof console as any === 'object' && typeof console.log as any === 'function') {\n console.log(`WARNING: ${message}`, ...optionalParams);\n }\n}\n\nexport type NotNull = T extends null ? never : T;\nexport type RequiredNoNull = {[P in keyof T]-?: NotNull};\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 return !(typeof value === 'undefined' || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean {\n if (typeof value === 'number') {\n return constructor === Number;\n } else if (typeof value === 'string') {\n return constructor === String;\n } else if (typeof value === 'boolean') {\n return constructor === Boolean;\n } else if (isObject(value)) {\n return value instanceof constructor;\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n typeof Reflect as any === 'object' && typeof Reflect.getMetadata as any === '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 if (typeof fn.name as string | undefined === 'string') {\n return fn.name;\n }\n return 'undefined';\n}\n\nexport function identity(arg: T): T {\n return arg;\n}\n","import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers';\nimport {OptionsBase} from './options-base';\nimport {TypeDescriptor} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__';\n\nexport type TypeResolver = (\n sourceObject: IndexedObject,\n knownTypes: Map,\n) => Function | undefined | null;\nexport type TypeHintEmitter\n = (\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n ) => void;\n\nexport interface JsonMemberMetadata {\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean | null;\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 /** Type descriptor of the member. */\n type?: TypeDescriptor | null;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n options?: OptionsBase | null;\n\n /** Custom deserializer to use. */\n deserializer?: ((json: any) => any) | null;\n\n /** Custom serializer to use. */\n serializer?: ((value: any) => any) | null;\n}\n\nexport class JsonObjectMetadata {\n\n dataMembers = new Map();\n\n /** Set of known types used for polymorphic deserialization */\n knownTypes = new Set>();\n\n /** If present override the global function */\n typeHintEmitter?: TypeHintEmitter | null;\n /** If present override the global function */\n typeResolver?: TypeResolver | null;\n /** Gets or sets the constructor function for the jsonObject. */\n classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n 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 isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n name?: string | null;\n\n options?: OptionsBase | null;\n\n onDeserializedMethodName?: string | null;\n\n beforeSerializationMethodName?: string | null;\n\n initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null;\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\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 static getJsonObjectName(ctor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata === undefined ? nameof(ctor) : nameof(metadata.classType);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined {\n const prototype = ctor.prototype;\n if (prototype == null) {\n return;\n }\n\n let metadata: JsonObjectMetadata | undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) {\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?.isExplicitlyMarked === true) {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor)) {\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 static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata {\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) {\n return prototype[METADATA_FIELD_KEY];\n }\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n const objectMetadata = new JsonObjectMetadata(prototype.constructor);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata | undefined = prototype[METADATA_FIELD_KEY];\n if (parentMetadata !== undefined) {\n parentMetadata.dataMembers.forEach((memberMetadata, propKey) => {\n objectMetadata.dataMembers.set(propKey, memberMetadata);\n });\n parentMetadata.knownTypes.forEach((knownType) => {\n objectMetadata.knownTypes.add(knownType);\n });\n objectMetadata.typeResolver = parentMetadata.typeResolver;\n objectMetadata.typeHintEmitter = parentMetadata.typeHintEmitter;\n }\n\n Object.defineProperty(prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata,\n });\n return objectMetadata;\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n static getKnownTypeNameFromType(constructor: Function): string {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata === undefined ? nameof(constructor) : nameof(metadata.classType);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n}\n\nexport function injectMetadataInformation(\n prototype: IndexedObject,\n propKey: string | symbol,\n metadata: JsonMemberMetadata,\n) {\n // For error messages\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor\n // function.\n // See:\n // eslint-disable-next-line max-len\n // 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 prototype as any === 'function') {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // symbol indexing is not supported by ts\n if (typeof prototype[propKey as string] === 'function') {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n // @todo check if metadata is ever undefined, if so, change parameter type\n if (metadata as any == null\n || (metadata.type === undefined && metadata.deserializer === undefined)) {\n logError(`${decoratorName}: JsonMemberMetadata has unknown type.`);\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\n // with '@jsonObject' as well.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(prototype);\n\n if (metadata.deserializer === undefined) {\n // If deserializer is not present then type must be\n metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor));\n }\n\n // clear metadata of undefined properties to save memory\n (Object.keys(metadata) as [keyof JsonMemberMetadata])\n .forEach((key) => (metadata[key] === undefined) && delete metadata[key]);\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import {RequiredNoNull} from './helpers';\n\n/**\n * This options cascade through the annotations. Options set\n * in the more specific place override the previous option.\n * Ex. @jsonMember overrides TypedJson options.\n */\nexport interface OptionsBase {\n /**\n * Whether to preserve null in the JSON output. When false it\n * will not emit nor store the property if its value is null.\n * Default: false.\n */\n preserveNull?: boolean | null;\n}\n\nconst kAllOptions: Array = [\n 'preserveNull',\n];\n\nexport function extractOptionBase(\n from: {[key: string]: any} & OptionsBase,\n): OptionsBase | undefined {\n const options = Object.keys(from)\n .filter(key => (kAllOptions as Array).indexOf(key) > -1)\n .reduce((obj, key) => {\n obj[key] = from[key];\n return obj;\n }, {} as any);\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function getDefaultOptionOf(\n key: K,\n): RequiredNoNull[K] {\n switch (key) {\n case 'preserveNull':\n return false;\n }\n // never reached\n return null as any;\n}\n\nexport function getOptionValue(\n key: K,\n options?: OptionsBase | null,\n): RequiredNoNull[K] {\n if (options != null && options[key] as any != null) {\n return options[key]!;\n }\n\n return getDefaultOptionOf(key);\n}\n\nexport function mergeOptions(\n existing?: OptionsBase,\n moreSpecific?: OptionsBase | null,\n): OptionsBase | undefined {\n return moreSpecific == null\n ? existing\n : {\n\n ...existing,\n ...moreSpecific,\n };\n}\n","export abstract class TypeDescriptor {\n protected constructor(readonly ctor: Function) {\n }\n\n getTypes(): Array {\n return [this.ctor];\n }\n}\n\nexport type Typelike = TypeDescriptor | Function;\n\nexport class ConcreteTypeDescriptor extends TypeDescriptor {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport abstract class GenericTypeDescriptor extends TypeDescriptor {\n protected constructor(ctor: Function) {\n super(ctor);\n }\n}\n\nexport class ArrayTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Array);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function ArrayT(elementType: Typelike): ArrayTypeDescriptor {\n return new ArrayTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport class SetTypeDescriptor extends GenericTypeDescriptor {\n constructor(readonly elementType: TypeDescriptor) {\n super(Set);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.elementType.getTypes());\n }\n}\n\nexport function SetT(elementType: Typelike): SetTypeDescriptor {\n return new SetTypeDescriptor(ensureTypeDescriptor(elementType));\n}\n\nexport const enum MapShape {\n /**\n * A map will be serialized as an array of {key: ..., value: ...} objects.\n */\n ARRAY,\n\n /**\n * A map will be serialized as a JSON object.\n */\n OBJECT,\n}\n\nexport interface MapOptions {\n /**\n * How the map should be serialized. Default is ARRAY.\n */\n shape: MapShape;\n}\n\nexport class MapTypeDescriptor extends GenericTypeDescriptor {\n constructor(\n readonly keyType: TypeDescriptor,\n readonly valueType: TypeDescriptor,\n readonly options?: Partial,\n ) {\n super(Map);\n }\n\n getTypes(): Array {\n return super.getTypes().concat(this.keyType.getTypes(), this.valueType.getTypes());\n }\n\n getCompleteOptions(): MapOptions {\n return {\n shape: this.options?.shape ?? MapShape.ARRAY,\n };\n }\n}\n\nexport function MapT(\n keyType: Typelike,\n valueType: Typelike,\n options?: Partial,\n): MapTypeDescriptor {\n return new MapTypeDescriptor(\n ensureTypeDescriptor(keyType),\n ensureTypeDescriptor(valueType),\n options,\n );\n}\n\n// TODO support for dictionary types ie. maps that are plain objects\n// export class DictionaryTypeDescriptor extends GenericTypeDescriptor {\n// constructor(public readonly elementType: TypeDescriptor) {\n// super(Object);\n// }\n//\n// getTypes(): Function[] {\n// return super.getTypes().concat(this.elementType.getTypes());\n// }\n// }\n//\n// export function DictT(elementType: Typelike): DictionaryTypeDescriptor {\n// return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType));\n// }\n\nexport function isTypelike(type: any): type is Typelike {\n return type != null && (typeof type === 'function' || type instanceof TypeDescriptor);\n}\n\nexport function ensureTypeDescriptor(type: Typelike): TypeDescriptor {\n return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type);\n}\n","import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers';\nimport {JsonObjectMetadata, TypeResolver} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './types';\n\nexport function defaultTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map,\n): Function | undefined {\n if (sourceObject.__type != null) {\n return knownTypes.get(sourceObject.__type);\n }\n}\n\nexport type DeserializerFn = (\n sourceObject: Raw,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n) => T;\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 options?: OptionsBase;\n\n private typeResolver: TypeResolver = defaultTypeResolver;\n private nameResolver?: (ctor: Function) => string;\n private errorHandler: (error: Error) => void = logError;\n private deserializationStrategy = new Map<\n Serializable,\n DeserializerFn\n >([\n // primitives\n [Number, deserializeDirectly],\n [String, deserializeDirectly],\n [Boolean, deserializeDirectly],\n\n [Date, deserializeDate],\n [ArrayBuffer, stringToArrayBuffer],\n [DataView, stringToDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsFloatArray],\n [Float64Array, convertAsFloatArray],\n [Uint8Array, convertAsUintArray],\n [Uint8ClampedArray, convertAsUintArray],\n [Uint16Array, convertAsUintArray],\n [Uint32Array, convertAsUintArray],\n ]);\n\n setNameResolver(nameResolverCallback: (ctor: Function) => string) {\n this.nameResolver = nameResolverCallback;\n }\n\n setTypeResolver(typeResolverCallback: TypeResolver) {\n if (typeof typeResolverCallback as any !== 'function') {\n throw new TypeError('\\'typeResolverCallback\\' is not a function.');\n }\n\n this.typeResolver = typeResolverCallback;\n }\n\n getTypeResolver(): TypeResolver {\n return this.typeResolver;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n } else if (!isValueDefined(sourceObject)) {\n return;\n }\n\n const deserializer = this.deserializationStrategy.get(typeDescriptor.ctor);\n if (deserializer !== undefined) {\n return deserializer(\n sourceObject,\n typeDescriptor,\n knownTypes,\n memberName,\n this,\n memberOptions,\n );\n }\n\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this);\n }\n this.errorHandler(new TypeError(\n `Could not deserialize '${memberName}': don't know how to deserialize this type'.`,\n ));\n }\n\n instantiateType(ctor: any) {\n return new ctor();\n }\n\n mergeKnownTypes(...knownTypeMaps: Array>) {\n const result = new Map();\n\n knownTypeMaps.forEach(knownTypes => {\n knownTypes.forEach((ctor, name) => {\n if (this.nameResolver === undefined) {\n result.set(name, ctor);\n } else {\n result.set(this.nameResolver(ctor), ctor);\n }\n });\n });\n\n return result;\n }\n\n createKnownTypesMap(knowTypes: Set) {\n const map = new Map();\n\n knowTypes.forEach(ctor => {\n if (this.nameResolver === undefined) {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const customName = knownTypeMeta?.isExplicitlyMarked === true\n ? knownTypeMeta.name\n : null;\n map.set(customName ?? ctor.name, ctor);\n } else {\n map.set(this.nameResolver(ctor), ctor);\n }\n });\n\n return map;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\n }\n\n private isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n }\n}\n\nfunction throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string,\n): never {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n}\n\nfunction makeTypeErrorMessage(\n expectedType: Function | string,\n actualType: Function | string,\n memberName: string,\n) {\n const expectedTypeName = typeof expectedType === 'function'\n ? nameof(expectedType)\n : expectedType;\n const actualTypeName = typeof actualType === 'function' ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}',`\n + ` got '${actualTypeName}'.`;\n}\n\nfunction srcTypeNameForDebug(sourceObject: any) {\n return sourceObject == null ? 'undefined' : nameof(sourceObject.constructor);\n}\n\nfunction deserializeDirectly(\n sourceObject: T,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n objectName: string,\n): T {\n if (sourceObject.constructor !== typeDescriptor.ctor) {\n throw new TypeError(makeTypeErrorMessage(\n nameof(typeDescriptor.ctor),\n sourceObject.constructor,\n objectName,\n ));\n }\n return sourceObject;\n}\n\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n): IndexedObject | T | undefined {\n if (typeof sourceObject as any !== 'object' || sourceObject as any === null) {\n deserializer.getErrorHandler()(new TypeError(\n `Cannot deserialize ${memberName}: 'sourceObject' must be a defined object.`,\n ));\n return undefined;\n }\n\n let expectedSelfType = typeDescriptor.ctor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = knownTypes;\n let typeResolver = deserializer.getTypeResolver();\n\n if (sourceObjectMetadata !== undefined) {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n if (sourceObjectMetadata.typeResolver != null) {\n typeResolver = sourceObjectMetadata.typeResolver;\n }\n }\n\n // Check if a type-hint is available from the source object.\n const typeFromTypeHint = typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint != null) {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType)) {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata !== undefined) {\n // Also merge new known types from subtype.\n knownTypeConstructors = deserializer.mergeKnownTypes(\n knownTypeConstructors,\n deserializer.createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata?.isExplicitlyMarked === true) {\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 const classOptions = mergeOptions(deserializer.options, sourceMetadata.options);\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((objMemberMetadata, propKey) => {\n const objMemberValue = sourceObject[propKey];\n const objMemberDebugName = `${nameof(sourceMetadata.classType)}.${propKey}`;\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n\n let revivedValue;\n if (objMemberMetadata.deserializer != null) {\n revivedValue = objMemberMetadata.deserializer(objMemberValue);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Cannot deserialize ${objMemberDebugName} there is`\n + ` no constructor nor deserialization function to use.`,\n );\n } else {\n revivedValue = deserializer.convertSingleValue(\n objMemberValue,\n objMemberMetadata.type,\n knownTypeConstructors,\n objMemberDebugName,\n objMemberOptions,\n );\n }\n\n // @todo revivedValue will never be null in RHS of ||\n if (isValueDefined(revivedValue)\n || (deserializer.retrievePreserveNull(objMemberOptions)\n && revivedValue as any === null)\n ) {\n sourceObjectWithDeserializedProperties[objMemberMetadata.key] = revivedValue;\n } else if (objMemberMetadata.isRequired === true) {\n deserializer.getErrorHandler()(new TypeError(\n `Missing required member '${objMemberDebugName}'.`,\n ));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === 'function') {\n try {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (targetObject as any == null) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n } else if (!(targetObject instanceof sourceObjectMetadata.classType)) {\n throw new TypeError(\n `Cannot deserialize ${memberName}:`\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 } catch (e) {\n deserializer.getErrorHandler()(e);\n return undefined;\n }\n } else {\n targetObject = deserializer.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 const methodName = sourceObjectMetadata.onDeserializedMethodName;\n if (methodName != null) {\n if (typeof (targetObject as any)[methodName] === 'function') {\n // check for member first\n (targetObject as any)[methodName]();\n } else if (typeof (targetObject.constructor as any)[methodName] === 'function') {\n // check for static\n (targetObject.constructor as any)[methodName]();\n } else {\n deserializer.getErrorHandler()(new TypeError(\n `onDeserialized callback`\n + `'${nameof(sourceObjectMetadata.classType)}.${methodName}' is not a method.`,\n ));\n }\n }\n\n return targetObject;\n } else {\n // Untyped deserialization into Object instance.\n const targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey => {\n targetObject[sourceKey] = deserializer.convertSingleValue(\n sourceObject[sourceKey],\n new ConcreteTypeDescriptor(sourceObject[sourceKey].constructor),\n knownTypes,\n sourceKey,\n );\n });\n\n return targetObject;\n }\n}\n\nfunction convertAsArray(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Array: incorrect TypeDescriptor detected,`\n + ' please use proper annotation or function for this type',\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(Array, sourceObject.constructor, memberName)),\n );\n return [];\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Array: missing constructor reference of`\n + ` Array elements.`,\n ),\n );\n return [];\n }\n\n return sourceObject.map((element, i) => {\n // If an array element fails to deserialize, substitute with undefined. This is so that the\n // original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try {\n return deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n );\n } catch (e) {\n deserializer.getErrorHandler()(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\nfunction convertAsSet(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Set {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Set: incorrect TypeDescriptor detected,`\n + ` please use proper annotation or function for this type`,\n );\n }\n if (!Array.isArray(sourceObject)) {\n deserializer.getErrorHandler()(new TypeError(makeTypeErrorMessage(\n Array,\n sourceObject.constructor,\n memberName,\n )));\n return new Set();\n }\n\n if (typeDescriptor.elementType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(\n `Could not deserialize ${memberName} as Set: missing constructor reference of`\n + ` Set elements.`,\n ),\n );\n return new Set();\n }\n\n const resultSet = new Set();\n\n sourceObject.forEach((element, i) => {\n try {\n resultSet.add(deserializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n knownTypes,\n `${memberName}[${i}]`,\n memberOptions,\n ));\n } catch (e) {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry\n // does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n\n return resultSet;\n}\n\nfunction isExpectedMapShape(source: any, expectedShape: MapShape): boolean {\n return (expectedShape === MapShape.ARRAY && Array.isArray(source))\n || (expectedShape === MapShape.OBJECT && typeof source === 'object');\n}\n\nfunction convertAsMap(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n deserializer: Deserializer,\n memberOptions?: OptionsBase,\n): Map {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not deserialize ${memberName} as Map: incorrect TypeDescriptor detected,`\n + 'please use proper annotation or function for this type',\n );\n }\n const expectedShape = typeDescriptor.getCompleteOptions().shape;\n if (!isExpectedMapShape(sourceObject, expectedShape)) {\n const expectedType = expectedShape === MapShape.ARRAY ? Array : Object;\n deserializer.getErrorHandler()(\n new TypeError(makeTypeErrorMessage(expectedType, sourceObject.constructor, memberName)),\n );\n return new Map();\n }\n\n if (typeDescriptor.keyType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`),\n );\n return new Map();\n }\n\n if (typeDescriptor.valueType as any == null) {\n deserializer.getErrorHandler()(\n new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`),\n );\n return new Map();\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultMap = new Map();\n\n if (expectedShape === MapShape.OBJECT) {\n Object.keys(sourceObject).forEach(key => {\n try {\n const resultKey = deserializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n if (isValueDefined(resultKey)) {\n resultMap.set(\n resultKey,\n deserializer.convertSingleValue(\n sourceObject[key],\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n } else {\n sourceObject.forEach((element: any) => {\n try {\n const key = deserializer.convertSingleValue(\n element.key,\n typeDescriptor.keyType,\n knownTypes,\n keyMemberName,\n memberOptions,\n );\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key)) {\n resultMap.set(\n key,\n deserializer.convertSingleValue(\n element.value,\n typeDescriptor.valueType,\n knownTypes,\n valueMemberName,\n memberOptions,\n ),\n );\n }\n } catch (e) {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n deserializer.getErrorHandler()(e);\n }\n });\n }\n\n return resultMap;\n}\n\nfunction deserializeDate(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): Date {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since\n // the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === 'string'\n || (typeof sourceObject === 'number' && sourceObject > 0)) {\n return new Date(sourceObject as any);\n } else if (sourceObject instanceof Date) {\n return sourceObject;\n } else {\n throwTypeMismatchError(\n 'Date',\n 'an ISO-8601 string',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n}\n\nfunction stringToArrayBuffer(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'ArrayBuffer',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return createArrayBufferFromString(sourceObject);\n}\n\nfunction stringToDataView(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n) {\n if (typeof sourceObject !== 'string') {\n throwTypeMismatchError(\n 'DataView',\n 'a string source',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n }\n return new DataView(createArrayBufferFromString(sourceObject));\n}\n\nfunction createArrayBufferFromString(input: string): ArrayBuffer {\n const buf = new ArrayBuffer(input.length * 2); // 2 bytes for each char\n const bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = input.length; i < strLen; i++) {\n bufView[i] = input.charCodeAt(i);\n }\n\n return buf;\n}\n\nfunction convertAsFloatArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n return new constructor(sourceObject);\n }\n return throwTypeMismatchError(\n constructor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n\n// @todo: investigate bitwise and types\nfunction convertAsUintArray(\n sourceObject: string | number | Date,\n typeDescriptor: TypeDescriptor,\n knownTypes: Map,\n memberName: string,\n): T {\n const constructor = typeDescriptor.ctor as Constructor;\n if (Array.isArray(sourceObject) && sourceObject.every(elem => !isNaN(elem))) {\n // eslint-disable-next-line no-bitwise\n return new constructor(sourceObject.map(value => ~~value));\n }\n return throwTypeMismatchError(\n typeDescriptor.ctor.name,\n 'a numeric source array',\n srcTypeNameForDebug(sourceObject),\n memberName,\n );\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n isTypelike,\n TypeDescriptor,\n} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean | null;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(\n elementConstructor: Function | TypeDescriptor,\n options: IJsonArrayMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n const decoratorName =\n `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n logError(\n `${decoratorName}: could not resolve constructor of array elements at runtime.`,\n );\n return;\n }\n\n const dimensions = options.dimensions == null ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1) {\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\n // used on an array.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Array) {\n logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nexport function createArrayType(\n elementType: TypeDescriptor,\n dimensions: number,\n): ArrayTypeDescriptor {\n let type = new ArrayTypeDescriptor(elementType);\n for (let i = 1; i < dimensions; ++i) {\n type = new ArrayTypeDescriptor(type);\n }\n return type;\n}\n","import {\n identity,\n isInstanceOf,\n isValueDefined,\n logError,\n nameof,\n} from './helpers';\nimport {JsonObjectMetadata, TypeHintEmitter} from './metadata';\nimport {getOptionValue, mergeOptions, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ConcreteTypeDescriptor,\n MapShape,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject, Serializable} from './types';\n\nexport function defaultTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // By default, we put a \"__type\" property on the output object if the actual object is not the\n // same as the expected one, so that deserialization will know what to deserialize into (given\n // the required known-types are defined, and the object is a valid subtype of the expected\n // type).\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject.__type = sourceTypeMetadata?.name ?? nameof(sourceObject.constructor);\n }\n}\n\n/**\n * @param sourceObject The original object that should be serialized.\n * @param typeDescriptor Instance of TypeDescriptor containing information about expected\n * serialization.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @param serializer Serializer instance, aiding with recursive serialization.\n * @param memberOptions If converted as a member, the member options.\n */\nexport type SerializerFn = (\n sourceObject: T,\n typeDescriptor: TD,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) => Raw;\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class\n * instances, and so on) to an untyped javascript object (also called \"simple javascript object\"),\n * 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\n * 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 options?: OptionsBase;\n private typeHintEmitter: TypeHintEmitter = defaultTypeEmitter;\n private errorHandler: (error: Error) => void = logError;\n private serializationStrategy = new Map<\n Serializable,\n SerializerFn\n >([\n // primitives\n [Date, identity],\n [Number, identity],\n [String, identity],\n [Boolean, identity],\n\n [ArrayBuffer, convertAsArrayBuffer],\n [DataView, convertAsDataView],\n\n [Array, convertAsArray],\n [Set, convertAsSet],\n [Map, convertAsMap],\n\n // typed arrays\n [Float32Array, convertAsTypedArray],\n [Float64Array, convertAsTypedArray],\n [Int8Array, convertAsTypedArray],\n [Uint8Array, convertAsTypedArray],\n [Uint8ClampedArray, convertAsTypedArray],\n [Int16Array, convertAsTypedArray],\n [Uint16Array, convertAsTypedArray],\n [Int32Array, convertAsTypedArray],\n [Uint32Array, convertAsTypedArray],\n ]);\n\n setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) {\n if (typeof typeEmitterCallback as any !== 'function') {\n throw new TypeError('\\'typeEmitterCallback\\' is not a function.');\n }\n\n this.typeHintEmitter = typeEmitterCallback;\n }\n\n getTypeHintEmitter(): TypeHintEmitter {\n return this.typeHintEmitter;\n }\n\n setErrorHandler(errorHandlerCallback: (error: Error) => void) {\n if (typeof errorHandlerCallback as any !== 'function') {\n throw new TypeError('\\'errorHandlerCallback\\' is not a function.');\n }\n\n this.errorHandler = errorHandlerCallback;\n }\n\n getErrorHandler(): (error: Error) => void {\n return this.errorHandler;\n }\n\n retrievePreserveNull(memberOptions?: OptionsBase): boolean {\n return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions));\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 convertSingleValue(\n sourceObject: any,\n typeDescriptor: TypeDescriptor,\n memberName: string = 'object',\n memberOptions?: OptionsBase,\n ): any {\n if (this.retrievePreserveNull(memberOptions) && sourceObject === null) {\n return null;\n }\n if (!isValueDefined(sourceObject)) {\n return;\n }\n\n if (!isInstanceOf(sourceObject, typeDescriptor.ctor)) {\n const expectedName = nameof(typeDescriptor.ctor);\n const actualName = nameof(sourceObject.constructor);\n\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': expected '${expectedName}',`\n + ` got '${actualName}'.`,\n ));\n return;\n }\n\n const serializer = this.serializationStrategy.get(typeDescriptor.ctor);\n if (serializer !== undefined) {\n return serializer(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n // if not present in the strategy do property by property serialization\n if (typeof sourceObject === 'object') {\n return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions);\n }\n this.errorHandler(new TypeError(\n `Could not serialize '${memberName}': don't know how to serialize this type'.`,\n ));\n }\n}\n\n/**\n * Performs the conversion of a typed object (usually a class instance) to a simple\n * javascript object for serialization.\n */\nfunction convertAsObject(\n sourceObject: IndexedObject,\n typeDescriptor: ConcreteTypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n) {\n let sourceTypeMetadata: JsonObjectMetadata | undefined;\n let targetObject: IndexedObject;\n let typeHintEmitter = serializer.getTypeHintEmitter();\n\n if (sourceObject.constructor !== typeDescriptor.ctor\n && sourceObject instanceof typeDescriptor.ctor) {\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 } else {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeDescriptor.ctor);\n }\n\n if (sourceTypeMetadata === undefined) {\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\n // don't want to modify\n // to the original object.\n targetObject = {...sourceObject};\n } else {\n const beforeSerializationMethodName = sourceTypeMetadata.beforeSerializationMethodName;\n if (beforeSerializationMethodName != null) {\n if (typeof (sourceObject as any)[beforeSerializationMethodName] === 'function') {\n // check for member first\n (sourceObject as any)[beforeSerializationMethodName]();\n } else if (typeof (sourceObject.constructor as any)[beforeSerializationMethodName]\n === 'function') {\n // check for static\n (sourceObject.constructor as any)[beforeSerializationMethodName]();\n } else {\n serializer.getErrorHandler()(new TypeError(\n `beforeSerialization callback '`\n + `${nameof(sourceTypeMetadata.classType)}.${beforeSerializationMethodName}`\n + `' is not a method.`,\n ));\n }\n }\n\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including\n // array/set/map members), and perform recursive conversion on each of them. The converted\n // objects are put on the 'targetObject', which is what will be put into 'JSON.stringify'\n // finally.\n targetObject = {};\n\n const classOptions = mergeOptions(serializer.options, sourceMeta.options);\n if (sourceMeta.typeHintEmitter != null) {\n typeHintEmitter = sourceMeta.typeHintEmitter;\n }\n\n sourceMeta.dataMembers.forEach((objMemberMetadata) => {\n const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options);\n let serialized;\n if (objMemberMetadata.serializer != null) {\n serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]);\n } else if (objMemberMetadata.type == null) {\n throw new TypeError(\n `Could not serialize ${objMemberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n } else {\n serialized = serializer.convertSingleValue(\n sourceObject[objMemberMetadata.key],\n objMemberMetadata.type,\n `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`,\n objMemberOptions,\n );\n }\n\n if ((serializer.retrievePreserveNull(objMemberOptions) && serialized === null)\n || isValueDefined(serialized)\n ) {\n targetObject[objMemberMetadata.name] = serialized;\n }\n });\n }\n\n // Add type-hint.\n typeHintEmitter(targetObject, sourceObject, typeDescriptor.ctor, 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\n * javascript objects\n * (or primitive values) for serialization.\n */\nfunction convertAsArray(\n sourceObject: Array,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Array: missing element type definition.`,\n );\n }\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\n // value emitted during serialization. This is so that invalid element types don't unexpectedly\n // 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 if (!(serializer.retrievePreserveNull(memberOptions) && element === null)\n && !isInstanceOf(element, typeDescriptor.elementType.ctor)\n ) {\n const expectedTypeName = nameof(typeDescriptor.elementType.ctor);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const actualTypeName = element && nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]:`\n + ` expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n return sourceObject.map((element, i) => {\n return serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n `${memberName}[${i}]`,\n memberOptions,\n );\n });\n}\n\n/**\n * Performs the conversion of a set of typed objects (or primitive values) into an array\n * of simple javascript objects.\n * @returns\n */\nfunction convertAsSet(\n sourceObject: Set,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): Array {\n if (!(typeDescriptor instanceof SetTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.elementType as any == null) {\n throw new TypeError(\n `Could not serialize ${memberName} as Set: missing element type definition.`,\n );\n }\n\n memberName += '[]';\n const resultArray: Array = [];\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.\n // (TODO: clarification needed)\n sourceObject.forEach((element) => {\n const resultElement = serializer.convertSingleValue(\n element,\n typeDescriptor.elementType,\n memberName,\n memberOptions,\n );\n\n // Add to output if the source element was undefined, OR the converted element is defined.\n // This will add intentionally undefined values to output, but not values that became\n // undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement)) {\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\n * of simple javascript objects with `key` and `value` properties.\n */\nfunction convertAsMap(\n sourceObject: Map,\n typeDescriptor: TypeDescriptor,\n memberName: string,\n serializer: Serializer,\n memberOptions?: OptionsBase,\n): IndexedObject | Array<{key: any; value: any}> {\n if (!(typeDescriptor instanceof MapTypeDescriptor)) {\n throw new TypeError(\n `Could not serialize ${memberName} as Map: incorrect TypeDescriptor detected, please`\n + ' use proper annotation or function for this type',\n );\n }\n if (typeDescriptor.valueType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing value type definition.`,\n );\n }\n\n if (typeDescriptor.keyType as any == null) { // @todo Check type\n throw new TypeError(\n `Could not serialize ${memberName} as Map: missing key type definition.`,\n );\n }\n\n const keyMemberName = `${memberName}[].key`;\n const valueMemberName = `${memberName}[].value`;\n const resultShape = typeDescriptor.getCompleteOptions().shape;\n const result = resultShape === MapShape.OBJECT ? ({} as IndexedObject) : [];\n const preserveNull = serializer.retrievePreserveNull(memberOptions);\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) => {\n const resultKeyValuePairObj = {\n key: serializer.convertSingleValue(\n key,\n typeDescriptor.keyType,\n keyMemberName,\n memberOptions,\n ),\n value: serializer.convertSingleValue(\n value,\n typeDescriptor.valueType,\n valueMemberName,\n memberOptions,\n ),\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n const keyDefined = isValueDefined(resultKeyValuePairObj.key);\n const valueDefined = (resultKeyValuePairObj.value === null && preserveNull)\n || isValueDefined(resultKeyValuePairObj.value);\n if (keyDefined && valueDefined) {\n if (resultShape === MapShape.OBJECT) {\n result[resultKeyValuePairObj.key] = resultKeyValuePairObj.value;\n } else {\n result.push(resultKeyValuePairObj);\n }\n }\n });\n\n return result;\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\n * with something like \"{ 0: 0, 1: 1, ... }\".\n */\nfunction convertAsTypedArray(sourceObject: ArrayBufferView) {\n return Array.from(sourceObject as any);\n}\n\n/**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\nfunction convertAsArrayBuffer(buffer: ArrayBuffer) {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer))\n .map(charCode => String.fromCharCode(charCode)).join('');\n}\n\n/**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and\n * returning that string.\n */\nfunction convertAsDataView(dataView: DataView) {\n return convertAsArrayBuffer(dataView.buffer);\n}\n","import {defaultTypeResolver, Deserializer} from './typedjson/deserializer';\nimport {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers';\nimport {createArrayType} from './typedjson/json-array-member';\nimport {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata';\nimport {extractOptionBase, OptionsBase} from './typedjson/options-base';\nimport {defaultTypeEmitter, Serializer} from './typedjson/serializer';\nimport {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor';\nimport {Constructor, IndexedObject, Serializable} from './typedjson/types';\n\nexport type JsonTypes = Object | boolean | string | number | null | undefined;\nexport {defaultTypeResolver, defaultTypeEmitter};\n\nexport interface ITypedJSONSettings extends OptionsBase {\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) | null;\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?: TypeResolver | null;\n\n nameResolver?: ((ctor: Function) => string) | null;\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?: TypeHintEmitter | null;\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 | null;\n\n replacer?: ((key: string, value: any) => any) | null;\n\n knownTypes?: Array> | null;\n}\n\nexport class TypedJSON {\n\n private static _globalConfig: ITypedJSONSettings | null | undefined;\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: Serializable;\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 rootConstructor The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Serializable, settings?: ITypedJSONSettings) {\n const rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (rootMetadata === undefined\n || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation)) {\n throw new TypeError(\n 'The TypedJSON root data type must have the @jsonObject decorator used.',\n );\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings !== undefined) {\n this.config(settings);\n } else if (TypedJSON._globalConfig !== undefined) {\n this.config({});\n }\n }\n\n static parse(\n object: any,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): T | undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: 1,\n ): Array;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 2,\n ): Array>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 3,\n ): Array>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 4,\n ): Array>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings: ITypedJSONSettings | undefined,\n dimensions: 5,\n ): Array>>>>;\n static parseAsArray(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n dimensions?: number,\n ): Array {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n static parseAsSet(\n object: any,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n static parseAsMap(\n object: any,\n keyType: Serializable,\n valueType: Serializable,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n static toPlainJson(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): Array>;\n static toPlainArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): Array>>;\n static toPlainArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4, settings?: ITypedJSONSettings,\n ): Array>>>;\n static toPlainArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): Array>>>>;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions: number,\n settings?: ITypedJSONSettings,\n ): Array;\n static toPlainArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): Array {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n static toPlainSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): Array | undefined {\n return new TypedJSON(elementType, settings).toPlainSet(object);\n }\n\n static toPlainMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n return new TypedJSON(valueCtor, settings).toPlainMap(object, keyCtor);\n }\n\n static stringify(\n object: T,\n rootType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: 1,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>,\n elementType: Serializable,\n dimensions: 2,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>,\n elementType: Serializable,\n dimensions: 3,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>,\n elementType: Serializable,\n dimensions: 4,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array>>>>,\n elementType: Serializable,\n dimensions: 5,\n settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n static stringifyAsArray(\n object: Array,\n elementType: Serializable,\n dimensions?: any,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n static stringifyAsSet(\n object: Set,\n elementType: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n static stringifyAsMap(\n object: Map,\n keyCtor: Serializable,\n valueCtor: Serializable,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n static setGlobalConfig(config: ITypedJSONSettings) {\n if (this._globalConfig == null) {\n this._globalConfig = config;\n } else {\n Object.assign(this._globalConfig, config);\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n config(settings: ITypedJSONSettings) {\n if (TypedJSON._globalConfig != null) {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings,\n };\n\n if (settings.knownTypes != null\n && TypedJSON._globalConfig.knownTypes != null) {\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 const options = extractOptionBase(settings);\n this.serializer.options = options;\n this.deserializer.options = options;\n\n if (settings.errorHandler != null) {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer != null) {\n this.replacer = settings.replacer;\n }\n if (settings.typeResolver != null) {\n this.deserializer.setTypeResolver(settings.typeResolver);\n }\n if (settings.typeHintEmitter != null) {\n this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n }\n if (settings.indent != null) {\n this.indent = settings.indent;\n }\n\n if (settings.nameResolver != null) {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n }\n\n if (settings.knownTypes != null) {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType: any, i) => {\n if (typeof knownType === 'undefined' || knownType === null) {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value`\n + ` (element ${i}).`,\n );\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 parse(object: any): T | undefined {\n const json = parseToJSObject(object, this.rootConstructor);\n\n const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T | undefined;\n const knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata !== undefined) {\n rootMetadata.knownTypes.forEach(knownTypeCtor => {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try {\n result = this.deserializer.convertSingleValue(\n json,\n ensureTypeDescriptor(this.rootConstructor),\n knownTypes,\n ) as T;\n } catch (e) {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n parseAsArray(object: any, dimensions?: 1): Array;\n parseAsArray(object: any, dimensions: 2): Array>;\n parseAsArray(object: any, dimensions: 3): Array>>;\n parseAsArray(object: any, dimensions: 4): Array>>>;\n parseAsArray(object: any, dimensions: 5): Array>>>>;\n parseAsArray(object: any, dimensions: number): Array;\n parseAsArray(object: any, dimensions: number = 1): Array {\n const json = parseToJSObject(object, Array);\n return this.deserializer.convertSingleValue(\n json,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsSet(object: any): Set {\n const json = parseToJSObject(object, Set);\n return this.deserializer.convertSingleValue(\n json,\n SetT(this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\n }\n\n parseAsMap(object: any, keyConstructor: Serializable): Map {\n const json = parseToJSObject(object, Map);\n return this.deserializer.convertSingleValue(\n json,\n MapT(keyConstructor, this.rootConstructor),\n this._mapKnownTypes(this.globalKnownTypes),\n );\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 toPlainJson(object: T): JsonTypes {\n try {\n return this.serializer.convertSingleValue(\n object,\n ensureTypeDescriptor(this.rootConstructor),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainArray(object: Array, dimensions?: 1): Array;\n toPlainArray(object: Array>, dimensions: 2): Array>;\n toPlainArray(object: Array>>, dimensions: 3): Array>>;\n toPlainArray(\n object: Array>>>,\n dimensions: 4,\n ): Array>>>;\n toPlainArray(\n object: Array>>>>,\n dimensions: 5,\n ): Array>>>>;\n toPlainArray(object: Array, dimensions: 1 | 2 | 3 | 4 | 5 = 1): Array | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n createArrayType(ensureTypeDescriptor(this.rootConstructor), dimensions),\n );\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainSet(object: Set): Array | undefined {\n try {\n return this.serializer.convertSingleValue(object, SetT(this.rootConstructor));\n } catch (e) {\n this.errorHandler(e);\n }\n }\n\n toPlainMap(\n object: Map,\n keyConstructor: Serializable,\n ): IndexedObject | Array<{key: any; value: any}> | undefined {\n try {\n return this.serializer.convertSingleValue(\n object,\n MapT(keyConstructor, this.rootConstructor),\n );\n } catch (e) {\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 stringify(object: T): string {\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 stringifyAsArray(object: Array, dimensions?: 1): string;\n stringifyAsArray(object: Array>, dimensions: 2): string;\n stringifyAsArray(object: Array>>, dimensions: 3): string;\n stringifyAsArray(object: Array>>>, dimensions: 4): string;\n stringifyAsArray(object: Array>>>>, dimensions: 5): string;\n stringifyAsArray(object: Array, dimensions: any): string {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n stringifyAsSet(object: Set): string {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n stringifyAsMap(object: Map, keyConstructor: Serializable): string {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>) {\n const map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n","import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {Serializable} from './types';\n\nexport type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T;\n\nexport interface IJsonObjectOptionsBase extends OptionsBase {\n /**\n * An array of known types to recognize when encountering type-hints.\n */\n knownTypes?: Array | null;\n\n /**\n * A function that will emit a type hint on the resulting JSON. It will override the global\n * typeEmitter.\n */\n typeHintEmitter?: TypeHintEmitter | null;\n\n /**\n * A function that given a source object will resolve the type that should be instantiated.\n * It will override the global type resolver.\n */\n typeResolver?: TypeResolver | null;\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 | null;\n\n /**\n * The name of a static or instance method to call before the serialization\n * of the typed object is started.\n */\n beforeSerialization?: string | null;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string | null;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer: InitializerCallback;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase {\n /**\n * Function to call before deserializing and initializing the object, accepting two arguments:\n * (1) sourceObject, an 'Object' instance with all properties already deserialized, and\n * (2) rawSourceObject, a raw 'Object' instance representation of the current object in\n * the serialized JSON (i.e. without deserialized properties).\n */\n initializer?: InitializerCallback | null;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with\n * additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(\n options?: IJsonObjectOptionsWithInitializer,\n): (target: Serializable) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\n// eslint-disable-next-line @typescript-eslint/unified-signatures\nexport function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: Serializable): void;\n\nexport function jsonObject(\n optionsOrTarget?: IJsonObjectOptions | Serializable,\n): ((target: Serializable) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n options = {};\n } else {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget ?? {};\n }\n\n function decorator(\n target: Serializable,\n ): void {\n // Create or obtain JsonObjectMetadata object.\n const objectMetadata = JsonObjectMetadata.ensurePresentInPrototype(target.prototype);\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n objectMetadata.beforeSerializationMethodName = options.beforeSerialization;\n\n if (options.typeResolver != null) {\n objectMetadata.typeResolver = options.typeResolver;\n }\n if (options.typeHintEmitter != null) {\n objectMetadata.typeHintEmitter = options.typeHintEmitter;\n }\n\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name != null) {\n objectMetadata.name = options.name;\n }\n const optionsBase = extractOptionBase(options);\n if (optionsBase !== undefined) {\n objectMetadata.options = optionsBase;\n }\n\n if (options.knownTypes != null) {\n options.knownTypes\n .filter(knownType => Boolean(knownType))\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === 'function') {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n } else {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n\nfunction isSubClass(target: Serializable) {\n return;\n}\n","import {\n isReflectMetadataSupported,\n isSubtypeOf,\n isValueDefined,\n logError,\n logWarning,\n MISSING_REFLECT_CONF_MSG,\n nameof,\n} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {\n ArrayTypeDescriptor,\n ensureTypeDescriptor,\n MapTypeDescriptor,\n SetTypeDescriptor,\n TypeDescriptor,\n} from './type-descriptor';\nimport {IndexedObject} from './types';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions extends OptionsBase {\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function | TypeDescriptor | null;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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\n * 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\n * declared.\n */\nexport function jsonMember(\n prototype: IndexedObject,\n propertyKey: string | symbol,\n): void;\n\nexport function jsonMember(\n optionsOrPrototype?: IJsonMemberOptions | IndexedObject,\n propKey?: string | symbol,\n): PropertyDecorator | void {\n // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string\n // The check is not required.\n if (propKey !== undefined\n && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) {\n const prototype = optionsOrPrototype as IndexedObject;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and\n // propKey.\n // Obtain property constructor through ReflectDecorators.\n if (!isReflectMetadataSupported) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option is`\n + ` specified.`,\n );\n return;\n }\n\n const reflectPropCtor: Function | null | undefined =\n Reflect.getMetadata('design:type', prototype, propKey);\n\n if (reflectPropCtor == null) {\n logError(\n `${decoratorName}: could not resolve detected property constructor at runtime.${\n MISSING_REFLECT_CONF_MSG}`,\n );\n return;\n }\n\n const typeDescriptor = ensureTypeDescriptor(reflectPropCtor);\n if (isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n\n injectMetadataInformation(prototype, propKey, {\n type: typeDescriptor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n } else {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) => {\n const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {};\n let typeDescriptor: TypeDescriptor | undefined;\n const decoratorName =\n `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`;\n\n if (options.hasOwnProperty('constructor')) {\n if (!isValueDefined(options.constructor)) {\n logError(\n `${decoratorName}: cannot resolve specified property constructor at`\n + ' runtime.',\n );\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to\n // check whether that constructor is correct. Warn if not.\n typeDescriptor = ensureTypeDescriptor(options.constructor);\n if (isReflectMetadataSupported && !isSubtypeOf(\n typeDescriptor.ctor,\n Reflect.getMetadata('design:type', target, _propKey),\n )) {\n logWarning(\n `${decoratorName}: detected property type does not match`\n + ` 'constructor' option.`,\n );\n }\n } else if (isReflectMetadataSupported) {\n const reflectCtor = Reflect.getMetadata(\n 'design:type',\n target,\n _propKey,\n ) as Function | null | undefined;\n\n if (reflectCtor == null) {\n logError(\n `${decoratorName}: cannot resolve detected property constructor at`\n + ` runtime.`,\n );\n return;\n }\n typeDescriptor = ensureTypeDescriptor(reflectCtor);\n } else if (options.deserializer === undefined) {\n logError(\n `${decoratorName}: ReflectDecorators is required if no 'constructor' option`\n + ` is specified.`,\n );\n return;\n }\n\n if (typeDescriptor !== undefined\n && isSpecialPropertyType(decoratorName, typeDescriptor)) {\n return;\n }\n injectMetadataInformation(target, _propKey, {\n type: typeDescriptor,\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\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, typeDescriptor: TypeDescriptor) {\n if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) {\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 {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, SetT} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions extends OptionsBase {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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'\n * for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(elementConstructor)) {\n 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\n // on a set. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Set) {\n logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: SetT(elementConstructor),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers';\nimport {injectMetadataInformation} from './metadata';\nimport {extractOptionBase, OptionsBase} from './options-base';\nimport {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor';\n\ndeclare abstract class Reflect {\n static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions extends OptionsBase, Partial {\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean | null;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean | null;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string | null;\n\n /**\n * When set, this deserializer will be used to deserialize the member. The callee must assure\n * the correct type.\n */\n deserializer?: ((json: any) => any) | null;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: ((value: any) => any) | null;\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(\n keyConstructor: Function | TypeDescriptor,\n valueConstructor: Function | TypeDescriptor,\n options: IJsonMapMemberOptions = {},\n) {\n return (target: Object, propKey: string | symbol) => {\n // For error messages\n const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n if (!isTypelike(keyConstructor)) {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (!isTypelike(valueConstructor)) {\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\n // on a map. Warn if not.\n if (isReflectMetadataSupported\n && Reflect.getMetadata('design:type', target, propKey) !== Map) {\n logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n type: MapT(keyConstructor, valueConstructor, {shape: options.shape}),\n emitDefaultValue: options.emitDefaultValue,\n isRequired: options.isRequired,\n options: extractOptionBase(options),\n key: propKey.toString(),\n name: options.name ?? propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import {TypedJSON} from '../parser';\n\n/**\n * Options for the @toJson decorator.\n */\nexport interface IToJsonOptions {\n /**\n * When set to true it will overwrite any toJSON already existing on the prototype.\n */\n overwrite?: boolean;\n}\n\n/**\n * Decorator that will generate toJSON function on the class prototype that allows\n * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will\n * simply delegate to TypedJSON.\n * By default it will throw if the prototype already has a toJSON function defined.\n * @param target the class which prototype should be modified.\n */\nexport function toJson(target: Function): void;\n/**\n * Decorator factory that accepts the options interface.\n * @param options for configuring the toJSON creation.\n */\nexport function toJson(options: IToJsonOptions): ((target: Function) => void);\nexport function toJson(\n optionsOrTarget: IToJsonOptions | Function,\n): ((target: Function) => void) | void {\n if (typeof optionsOrTarget === 'function') {\n // used directly\n toJsonDecorator(optionsOrTarget, {});\n return;\n }\n // used as a factory\n return (target: Function) => {\n toJsonDecorator(target, optionsOrTarget);\n };\n}\n\nfunction toJsonDecorator(target: Function, options: IToJsonOptions): void {\n if (options.overwrite !== true && target.prototype.toJSON !== undefined) {\n throw new Error(`${target.name} already has toJSON defined!`);\n }\n target.prototype.toJSON = function toJSON() {\n return TypedJSON.toPlainJson(this, Object.getPrototypeOf(this).constructor);\n };\n}\n","export {\n TypedJSON,\n ITypedJSONSettings,\n JsonTypes,\n defaultTypeResolver,\n defaultTypeEmitter,\n} from './parser';\nexport {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata';\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';\nexport {toJson} from './typedjson/to-json';\nexport {ArrayT, SetT, MapT} from './typedjson/type-descriptor';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/deserializer.d.ts b/js/typedjson/deserializer.d.ts deleted file mode 100644 index 13eefb5..0000000 --- a/js/typedjson/deserializer.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TypeResolver } from './metadata'; -import { OptionsBase } from './options-base'; -import { TypeDescriptor } from './type-descriptor'; -import { IndexedObject } from './types'; -export declare function defaultTypeResolver(sourceObject: IndexedObject, knownTypes: Map): Function | undefined; -export declare type DeserializerFn = (sourceObject: Raw, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName: string, deserializer: Deserializer, memberOptions?: OptionsBase) => T; -/** - * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree. - * It is used after parsing a JSON-string. - */ -export declare class Deserializer { - options?: OptionsBase; - private typeResolver; - private nameResolver?; - private errorHandler; - private deserializationStrategy; - setNameResolver(nameResolverCallback: (ctor: Function) => string): void; - setTypeResolver(typeResolverCallback: TypeResolver): void; - getTypeResolver(): TypeResolver; - setErrorHandler(errorHandlerCallback: (error: Error) => void): void; - getErrorHandler(): (error: Error) => void; - convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, knownTypes: Map, memberName?: string, memberOptions?: OptionsBase): any; - instantiateType(ctor: any): any; - mergeKnownTypes(...knownTypeMaps: Array>): Map; - createKnownTypesMap(knowTypes: Set): Map; - retrievePreserveNull(memberOptions?: OptionsBase): boolean; - private isExpectedMapShape; -} diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts deleted file mode 100644 index 23ad4e6..0000000 --- a/js/typedjson/helpers.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Serializable } from './types'; -export declare const MISSING_REFLECT_CONF_MSG: string; -/** - * Determines whether the specified type is a type that can be passed on "as-is" into - * `JSON.stringify`. - * Values of these types don't need special conversion. - * @param type The constructor of the type (wrapper constructor for primitive types, e.g. `Number` - * for `number`). - */ -export declare function isDirectlySerializableNativeType(type: Function): boolean; -export declare function isDirectlyDeserializableNativeType(type: Function): boolean; -export declare function isTypeTypedArray(type: Function): boolean; -export declare function isObject(value: any): value is Object; -export declare function parseToJSObject(json: any, expectedType: Serializable): Object; -/** - * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B'). - * @param A The supposed derived type. - * @param B The supposed base type. - */ -export declare function isSubtypeOf(A: Function, B: Function): boolean; -export declare function logError(message?: any, ...optionalParams: Array): void; -export declare function logMessage(message?: any, ...optionalParams: Array): void; -export declare function logWarning(message?: any, ...optionalParams: Array): void; -export declare type NotNull = T extends null ? never : T; -export declare type RequiredNoNull = { - [P in keyof T]-?: NotNull; -}; -/** - * Checks if the value is considered defined (not undefined and not null). - * @param value - */ -export declare function isValueDefined(value: T): value is Exclude; -export declare function isInstanceOf(value: any, constructor: Function): boolean; -export declare const isReflectMetadataSupported: boolean; -/** - * Gets the name of a function. - * @param fn The function whose name to get. - */ -export declare function nameof(fn: Function & { - name?: string; -}): string; -export declare function identity(arg: T): T; diff --git a/js/typedjson/json-array-member.d.ts b/js/typedjson/json-array-member.d.ts deleted file mode 100644 index 9f4be5d..0000000 --- a/js/typedjson/json-array-member.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { OptionsBase } from './options-base'; -import { ArrayTypeDescriptor, TypeDescriptor } from './type-descriptor'; -export interface IJsonArrayMemberOptions extends OptionsBase { - /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean | null; - /** When set, an empty array is emitted if the property is undefined/uninitialized. */ - emitDefaultValue?: boolean | null; - /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */ - dimensions?: number | null; - /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string | null; - /** - * When set, this deserializer will be used to deserialize the member. The callee must assure - * the correct type. - */ - deserializer?: ((json: any) => any) | null; - /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; -} -/** - * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' - * for 'Date[]'). - * @param options Additional options. - */ -export declare function jsonArrayMember(elementConstructor: Function | TypeDescriptor, options?: IJsonArrayMemberOptions): (target: Object, propKey: string | symbol) => void; -export declare function createArrayType(elementType: TypeDescriptor, dimensions: number): ArrayTypeDescriptor; diff --git a/js/typedjson/json-map-member.d.ts b/js/typedjson/json-map-member.d.ts deleted file mode 100644 index 4103522..0000000 --- a/js/typedjson/json-map-member.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { OptionsBase } from './options-base'; -import { MapOptions, TypeDescriptor } from './type-descriptor'; -export interface IJsonMapMemberOptions extends OptionsBase, Partial { - /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean | null; - /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean | null; - /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string | null; - /** - * When set, this deserializer will be used to deserialize the member. The callee must assure - * the correct type. - */ - deserializer?: ((json: any) => any) | null; - /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; -} -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Map. - * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map'). - * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). - * @param options Additional options. - */ -export declare function jsonMapMember(keyConstructor: Function | TypeDescriptor, valueConstructor: Function | TypeDescriptor, options?: IJsonMapMemberOptions): (target: Object, propKey: string | symbol) => void; diff --git a/js/typedjson/json-member.d.ts b/js/typedjson/json-member.d.ts deleted file mode 100644 index c111ec1..0000000 --- a/js/typedjson/json-member.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { OptionsBase } from './options-base'; -import { TypeDescriptor } from './type-descriptor'; -import { IndexedObject } from './types'; -export interface IJsonMemberOptions extends OptionsBase { - /** - * Sets the constructor of the property. - * Optional with ReflectDecorators. - */ - constructor?: Function | TypeDescriptor | null; - /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean | null; - /** When set, a default value is emitted if the property is uninitialized/undefined. */ - emitDefaultValue?: boolean | null; - /** When set, the key on the JSON that should be used instead of the class property name. */ - name?: string | null; - /** - * When set, this deserializer will be used to deserialize the member. The callee must assure - * the correct type. - */ - deserializer?: ((json: any) => any) | null; - /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; -} -/** - * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always - * explicitly declared. - * @param options Additional options. - */ -export declare function jsonMember(options: IJsonMemberOptions): PropertyDecorator; -/** - * Specifies that a property is part of the object when serializing. - * This call signature requires ReflectDecorators and that the property type is always explicitly - * declared. - */ -export declare function jsonMember(prototype: IndexedObject, propertyKey: string | symbol): void; diff --git a/js/typedjson/json-object.d.ts b/js/typedjson/json-object.d.ts deleted file mode 100644 index 747b595..0000000 --- a/js/typedjson/json-object.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TypeHintEmitter, TypeResolver } from './metadata'; -import { OptionsBase } from './options-base'; -import { Serializable } from './types'; -export declare type InitializerCallback = (sourceObject: T, rawSourceObject: T) => T; -export interface IJsonObjectOptionsBase extends OptionsBase { - /** - * An array of known types to recognize when encountering type-hints. - */ - knownTypes?: Array | null; - /** - * A function that will emit a type hint on the resulting JSON. It will override the global - * typeEmitter. - */ - typeHintEmitter?: TypeHintEmitter | null; - /** - * A function that given a source object will resolve the type that should be instantiated. - * It will override the global type resolver. - */ - typeResolver?: TypeResolver | null; - /** - * The name of a static or instance method to call when deserialization - * of the object is completed. - */ - onDeserialized?: string | null; - /** - * The name of a static or instance method to call before the serialization - * of the typed object is started. - */ - beforeSerialization?: string | null; - /** - * The name used to differentiate between different polymorphic types. - */ - name?: string | null; -} -export interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase { - /** - * Function to call before deserializing and initializing the object, accepting two arguments: - * (1) sourceObject, an 'Object' instance with all properties already deserialized, and - * (2) rawSourceObject, a raw 'Object' instance representation of the current object in - * the serialized JSON (i.e. without deserialized properties). - */ - initializer: InitializerCallback; -} -export interface IJsonObjectOptions extends IJsonObjectOptionsBase { - /** - * Function to call before deserializing and initializing the object, accepting two arguments: - * (1) sourceObject, an 'Object' instance with all properties already deserialized, and - * (2) rawSourceObject, a raw 'Object' instance representation of the current object in - * the serialized JSON (i.e. without deserialized properties). - */ - initializer?: InitializerCallback | null; -} -/** - * Marks that a class with a parameterized constructor is serializable using TypedJSON, with - * additional settings. The 'initializer' setting must be specified. - * @param options Configuration settings. - */ -export declare function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Serializable) => void; -/** - * Marks that a class is serializable using TypedJSON, with additional settings. - * @param options Configuration settings. - */ -export declare function jsonObject(options?: IJsonObjectOptions): (target: Serializable) => void; -/** - * Marks that a class with a parameterless constructor is serializable using TypedJSON. - */ -export declare function jsonObject(target: Serializable): void; diff --git a/js/typedjson/json-set-member.d.ts b/js/typedjson/json-set-member.d.ts deleted file mode 100644 index a6c164b..0000000 --- a/js/typedjson/json-set-member.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { OptionsBase } from './options-base'; -export interface IJsonSetMemberOptions extends OptionsBase { - /** When set, indicates that the member must be present when deserializing. */ - isRequired?: boolean | null; - /** When set, a default value is emitted for each uninitialized json member. */ - emitDefaultValue?: boolean | null; - /** When set, the key on the JSON that should be used instead of the class property name */ - name?: string | null; - /** - * When set, this deserializer will be used to deserialize the member. The callee must assure - * the correct type. - */ - deserializer?: ((json: any) => any) | null; - /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; -} -/** - * Specifies that the property is part of the object when serializing. - * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' - * for Set). - * @param options Additional options. - */ -export declare function jsonSetMember(elementConstructor: Function, options?: IJsonSetMemberOptions): (target: Object, propKey: string | symbol) => void; diff --git a/js/typedjson/metadata.d.ts b/js/typedjson/metadata.d.ts deleted file mode 100644 index e748e14..0000000 --- a/js/typedjson/metadata.d.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { OptionsBase } from './options-base'; -import { TypeDescriptor } from './type-descriptor'; -import { IndexedObject, Serializable } from './types'; -export declare const METADATA_FIELD_KEY = "__typedJsonJsonObjectMetadataInformation__"; -export declare type TypeResolver = (sourceObject: IndexedObject, knownTypes: Map) => Function | undefined | null; -export declare type TypeHintEmitter = (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void; -export interface JsonMemberMetadata { - /** If set, a default value will be emitted for uninitialized members. */ - emitDefaultValue?: boolean | null; - /** Member name as it appears in the serialized JSON. */ - name: string; - /** Property or field key of the json member. */ - key: string; - /** Type descriptor of the member. */ - type?: TypeDescriptor | null; - /** If set, indicates that the member must be present when deserializing. */ - isRequired?: boolean | null; - options?: OptionsBase | null; - /** Custom deserializer to use. */ - deserializer?: ((json: any) => any) | null; - /** Custom serializer to use. */ - serializer?: ((value: any) => any) | null; -} -export declare class JsonObjectMetadata { - dataMembers: Map; - /** Set of known types used for polymorphic deserialization */ - knownTypes: Set>; - /** If present override the global function */ - typeHintEmitter?: TypeHintEmitter | null; - /** If present override the global function */ - typeResolver?: TypeResolver | null; - /** Gets or sets the constructor function for the jsonObject. */ - classType: Function; - /** - * Indicates whether this class was explicitly annotated with @jsonObject - * or implicitly by @jsonMember - */ - isExplicitlyMarked: boolean; - /** - * Indicates whether this type is handled without annotation. This is usually - * used for the builtin types (except for Maps, Sets, and normal Arrays). - */ - isHandledWithoutAnnotation: boolean; - /** Name used to encode polymorphic type */ - name?: string | null; - options?: OptionsBase | null; - onDeserializedMethodName?: string | null; - beforeSerializationMethodName?: string | null; - initializerCallback?: ((sourceObject: Object, rawSourceObject: Object) => Object) | null; - constructor(classType: Function); - /** - * Gets the name of a class as it appears in a serialized JSON string. - * @param ctor The constructor of a class (with or without jsonObject). - */ - static getJsonObjectName(ctor: Function): string; - /** - * Gets jsonObject metadata information from a class. - * @param ctor The constructor class. - */ - static getFromConstructor(ctor: Serializable): JsonObjectMetadata | undefined; - static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata; - /** - * Gets the known type name of a jsonObject class for type hint. - * @param constructor The constructor class. - */ - static getKnownTypeNameFromType(constructor: Function): string; - private static doesHandleWithoutAnnotation; -} -export declare function injectMetadataInformation(prototype: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata): void; diff --git a/js/typedjson/options-base.d.ts b/js/typedjson/options-base.d.ts deleted file mode 100644 index 175fdcc..0000000 --- a/js/typedjson/options-base.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RequiredNoNull } from './helpers'; -/** - * This options cascade through the annotations. Options set - * in the more specific place override the previous option. - * Ex. @jsonMember overrides TypedJson options. - */ -export interface OptionsBase { - /** - * Whether to preserve null in the JSON output. When false it - * will not emit nor store the property if its value is null. - * Default: false. - */ - preserveNull?: boolean | null; -} -export declare function extractOptionBase(from: { - [key: string]: any; -} & OptionsBase): OptionsBase | undefined; -export declare function getDefaultOptionOf(key: K): RequiredNoNull[K]; -export declare function getOptionValue(key: K, options?: OptionsBase | null): RequiredNoNull[K]; -export declare function mergeOptions(existing?: OptionsBase, moreSpecific?: OptionsBase | null): OptionsBase | undefined; diff --git a/js/typedjson/serializer.d.ts b/js/typedjson/serializer.d.ts deleted file mode 100644 index f2e3c2a..0000000 --- a/js/typedjson/serializer.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { JsonObjectMetadata, TypeHintEmitter } from './metadata'; -import { OptionsBase } from './options-base'; -import { TypeDescriptor } from './type-descriptor'; -import { IndexedObject } from './types'; -export declare function defaultTypeEmitter(targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata): void; -/** - * @param sourceObject The original object that should be serialized. - * @param typeDescriptor Instance of TypeDescriptor containing information about expected - * serialization. - * @param memberName Name of the object being serialized, used for debugging purposes. - * @param serializer Serializer instance, aiding with recursive serialization. - * @param memberOptions If converted as a member, the member options. - */ -export declare type SerializerFn = (sourceObject: T, typeDescriptor: TD, memberName: string, serializer: Serializer, memberOptions?: OptionsBase) => Raw; -/** - * 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 called "simple javascript object"), - * and emits any necessary type hints in the process (for polymorphism). - * - * 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: - * - * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string - */ -export declare class Serializer { - options?: OptionsBase; - private typeHintEmitter; - private errorHandler; - private serializationStrategy; - setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter): void; - getTypeHintEmitter(): TypeHintEmitter; - setErrorHandler(errorHandlerCallback: (error: Error) => void): void; - getErrorHandler(): (error: Error) => void; - retrievePreserveNull(memberOptions?: OptionsBase): boolean; - /** - * Convert a value of any supported serializable type. - * The value type will be detected, and the correct serialization method will be called. - */ - convertSingleValue(sourceObject: any, typeDescriptor: TypeDescriptor, memberName?: string, memberOptions?: OptionsBase): any; -} diff --git a/js/typedjson/to-json.d.ts b/js/typedjson/to-json.d.ts deleted file mode 100644 index e989a8d..0000000 --- a/js/typedjson/to-json.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Options for the @toJson decorator. - */ -export interface IToJsonOptions { - /** - * When set to true it will overwrite any toJSON already existing on the prototype. - */ - overwrite?: boolean; -} -/** - * Decorator that will generate toJSON function on the class prototype that allows - * JSON.stringify to be used instead of TypedJSON.stringify. Under the hood it will - * simply delegate to TypedJSON. - * By default it will throw if the prototype already has a toJSON function defined. - * @param target the class which prototype should be modified. - */ -export declare function toJson(target: Function): void; -/** - * Decorator factory that accepts the options interface. - * @param options for configuring the toJSON creation. - */ -export declare function toJson(options: IToJsonOptions): ((target: Function) => void); diff --git a/js/typedjson/type-descriptor.d.ts b/js/typedjson/type-descriptor.d.ts deleted file mode 100644 index 08a4d90..0000000 --- a/js/typedjson/type-descriptor.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -export declare abstract class TypeDescriptor { - readonly ctor: Function; - protected constructor(ctor: Function); - getTypes(): Array; -} -export declare type Typelike = TypeDescriptor | Function; -export declare class ConcreteTypeDescriptor extends TypeDescriptor { - constructor(ctor: Function); -} -export declare abstract class GenericTypeDescriptor extends TypeDescriptor { - protected constructor(ctor: Function); -} -export declare class ArrayTypeDescriptor extends GenericTypeDescriptor { - readonly elementType: TypeDescriptor; - constructor(elementType: TypeDescriptor); - getTypes(): Array; -} -export declare function ArrayT(elementType: Typelike): ArrayTypeDescriptor; -export declare class SetTypeDescriptor extends GenericTypeDescriptor { - readonly elementType: TypeDescriptor; - constructor(elementType: TypeDescriptor); - getTypes(): Array; -} -export declare function SetT(elementType: Typelike): SetTypeDescriptor; -export declare const enum MapShape { - /** - * A map will be serialized as an array of {key: ..., value: ...} objects. - */ - ARRAY = 0, - /** - * A map will be serialized as a JSON object. - */ - OBJECT = 1 -} -export interface MapOptions { - /** - * How the map should be serialized. Default is ARRAY. - */ - shape: MapShape; -} -export declare class MapTypeDescriptor extends GenericTypeDescriptor { - readonly keyType: TypeDescriptor; - readonly valueType: TypeDescriptor; - readonly options?: Partial | undefined; - constructor(keyType: TypeDescriptor, valueType: TypeDescriptor, options?: Partial | undefined); - getTypes(): Array; - getCompleteOptions(): MapOptions; -} -export declare function MapT(keyType: Typelike, valueType: Typelike, options?: Partial): MapTypeDescriptor; -export declare function isTypelike(type: any): type is Typelike; -export declare function ensureTypeDescriptor(type: Typelike): TypeDescriptor; diff --git a/js/typedjson/types.d.ts b/js/typedjson/types.d.ts deleted file mode 100644 index a4bdb24..0000000 --- a/js/typedjson/types.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare type IndexedObject = Object & { - [key: string]: any; -}; -export interface AbstractType extends Function { - prototype: T; -} -export declare type Constructor = new (...args: Array) => T; -export declare type Serializable = Constructor | AbstractType; diff --git a/lint-staged.config.js b/lint-staged.config.js index 915183a..ffaebc0 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -4,6 +4,7 @@ function mapFilenames(filenames) { module.exports = { '*': () => [ + 'tsc -p tsconfig/tsconfig.app.json', 'npm run test', ], '*.ts': (filenames) => [ diff --git a/package.json b/package.json index 66d30e7..4bedcde 100644 --- a/package.json +++ b/package.json @@ -2,21 +2,26 @@ "name": "typedjson", "version": "1.6.0-rc2", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", - "main": "./js/typedjson.js", - "typings": "./js/typedjson.d.ts", + "main": "./lib/cjs/index.js", + "module": "./lib/esm5/index.js", + "es2015": "./lib/esm/index.js", + "types": "./lib/types/index.d.ts", + "sideEffects": false, "size-limit": [ { - "path": "js/typedjson.js", + "path": "./lib/esm/index.js", "limit": "6.5 KB" } ], "scripts": { + "build": "run-s build:*", + "build:clean": "rimraf ./lib", + "build:ts": "tsc --build ./tsconfig/tsconfig.bundle.*.json", "lint": "eslint \"spec/**/*.ts\" \"src/**/*.ts\"", - "test": "yarn run build && nyc ts-node --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", - "build": "webpack", - "preversion": "yarn test", - "version": "yarn run build && git add -A js", - "size": "size-limit" + "preversion": "yarn run test", + "size": "size-limit", + "test": "nyc ts-node-transpile-only --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", + "version": "yarn run build" }, "repository": { "type": "git", @@ -28,6 +33,9 @@ "url": "https://github.com/JohnWhiteTB/TypedJSON/issues" }, "homepage": "https://github.com/JohnWhiteTB/TypedJSON", + "dependencies": { + "tslib": "^2.0.1" + }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@matthiaskunnen/eslint-config-typescript": "^1.2.0", @@ -37,17 +45,13 @@ "husky": "^4.2.5", "jasmine": "^3.5.0", "lint-staged": "^10.2.13", + "npm-run-all": "^4.1.5", "nyc": "^15.0.0", "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", "size-limit": "^4.5.7", - "source-map-support": "^0.5.16", - "ts-loader": "^6.2.1", "ts-node": "^8.10.2", - "typescript": "^3.9.7", - "uglifyjs-webpack-plugin": "^2.2.0", - "webpack": "^4.41.5", - "webpack-auto-inject-version": "^1.2.2", - "webpack-cli": "^3.3.10" + "typescript": "^3.9.7" }, "husky": { "hooks": { @@ -55,6 +59,7 @@ } }, "files": [ - "js" + "lib/**/!(*.tsbuildinfo)", + "src" ] } diff --git a/spec/array.spec.ts b/spec/array.spec.ts index b410ee7..94e7377 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {Everything, IEverything} from './utils/everything'; describe('array of objects', () => { diff --git a/spec/base.spec.ts b/spec/base.spec.ts index fddfbbd..6eef90b 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {Everything} from './utils/everything'; describe('basic serialization of', () => { diff --git a/spec/before-serialization.spec.ts b/spec/before-serialization.spec.ts index fe6c2fa..6abec4e 100644 --- a/spec/before-serialization.spec.ts +++ b/spec/before-serialization.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonMember, jsonObject, TypedJSON} from '../src'; describe('beforeSerialization', () => { it('should call the static method', () => { diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index 4e66b48..75b8cc3 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; describe('custom member deserializer', () => { @jsonObject diff --git a/spec/custom-serializer.spec.ts b/spec/custom-serializer.spec.ts index df5ab17..e349e93 100644 --- a/spec/custom-serializer.spec.ts +++ b/spec/custom-serializer.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; describe('custom member serializer', () => { @jsonObject diff --git a/spec/helpers.spec.ts b/spec/helpers.spec.ts index b8f5188..2eecce2 100644 --- a/spec/helpers.spec.ts +++ b/spec/helpers.spec.ts @@ -1,4 +1,4 @@ -import {shouldOmitParseString} from '../src/typedjson/helpers'; +import {shouldOmitParseString} from '../src/helpers'; describe('helpers', () => { describe('shouldOmitParseString', () => { diff --git a/spec/initializer.spec.ts b/spec/initializer.spec.ts index 8e66076..8af5825 100644 --- a/spec/initializer.spec.ts +++ b/spec/initializer.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonMember, jsonObject, TypedJSON} from '../src'; describe('initializer', () => { it('should be called', () => { diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index 1ba10ad..50f4f13 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; describe('json (without automatic stringify)', () => { describe('string', () => { diff --git a/spec/map.spec.ts b/spec/map.spec.ts index 12b70d7..3e22643 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -1,8 +1,8 @@ +import {ArrayT, jsonMapMember} from '../src'; +import {jsonMember} from '../src/json-member'; +import {jsonObject} from '../src/json-object'; import {TypedJSON} from '../src/parser'; -import {ArrayT, jsonMapMember} from '../src/typedjson'; -import {jsonMember} from '../src/typedjson/json-member'; -import {jsonObject} from '../src/typedjson/json-object'; -import {MapShape} from '../src/typedjson/type-descriptor'; +import {MapShape} from '../src/type-descriptor'; describe('map dictionary shape', () => { @jsonObject diff --git a/spec/on-deserialized.spec.ts b/spec/on-deserialized.spec.ts index 118103f..fc852d0 100644 --- a/spec/on-deserialized.spec.ts +++ b/spec/on-deserialized.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonMember, jsonObject, TypedJSON} from '../src'; describe('onDeserialized', () => { it('should call the static method', () => { diff --git a/spec/parse-to-object.spec.ts b/spec/parse-to-object.spec.ts index 83df746..aac315e 100644 --- a/spec/parse-to-object.spec.ts +++ b/spec/parse-to-object.spec.ts @@ -1,4 +1,4 @@ -import {parseToJSObject} from '../src/typedjson/helpers'; +import {parseToJSObject} from '../src/helpers'; describe('parse To Object', () => { it('should passthrough objects', () => { diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 2a7cc85..23d5ffb 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic abstract classes', () => { diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 387936d..7399494 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic custom names', () => { diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index 7827741..0d2c27c 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -1,5 +1,5 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; -import {IndexedObject} from '../src/typedjson/types'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {IndexedObject} from '../src/types'; describe('polymorphism custom type hints', () => { describe('should work for a base class', () => { diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index 74b2759..4ea400e 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic interfaces', () => { diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index 76a702e..71c7168 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphism in nested arrays', () => { diff --git a/spec/polymorphism-root-abstract-class.spec.ts b/spec/polymorphism-root-abstract-class.spec.ts index 2dacf51..0a4053d 100644 --- a/spec/polymorphism-root-abstract-class.spec.ts +++ b/spec/polymorphism-root-abstract-class.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonMember, jsonObject, TypedJSON} from '../src'; describe('single class', () => { abstract class Person { diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index a20952b..6a0fd6e 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphism', () => { diff --git a/spec/preserve-null.spec.ts b/spec/preserve-null.spec.ts index 2b8d42d..c7e3fea 100644 --- a/spec/preserve-null.spec.ts +++ b/spec/preserve-null.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMapMember, jsonMember, jsonObject, TypedJSON} from '../src/typedjson'; +import {jsonArrayMember, jsonMapMember, jsonMember, jsonObject, TypedJSON} from '../src'; describe('preserveNull', () => { it('should work globally', () => { diff --git a/spec/set.spec.ts b/spec/set.spec.ts index ed98816..39b8056 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,4 +1,4 @@ -import {ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src/typedjson'; +import {ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; import {Everything} from './utils/everything'; describe('set of objects', () => { diff --git a/spec/to-json.spec.ts b/spec/to-json.spec.ts index 80574eb..8a3f829 100644 --- a/spec/to-json.spec.ts +++ b/spec/to-json.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, toJson} from '../src/typedjson'; +import {jsonMember, jsonObject, toJson} from '../src'; describe('toJson decorator', () => { it('should work with JSON.stringify', () => { diff --git a/spec/utils/everything.ts b/spec/utils/everything.ts index 5fb093a..5952cd4 100644 --- a/spec/utils/everything.ts +++ b/spec/utils/everything.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject} from '../../src/typedjson'; +import {jsonMember, jsonObject} from '../../src'; export enum JustEnum { One, diff --git a/src/typedjson/deserializer.ts b/src/deserializer.ts similarity index 100% rename from src/typedjson/deserializer.ts rename to src/deserializer.ts diff --git a/src/typedjson/helpers.ts b/src/helpers.ts similarity index 100% rename from src/typedjson/helpers.ts rename to src/helpers.ts diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..0852ff3 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,15 @@ +export { + TypedJSON, + ITypedJSONSettings, + JsonTypes, + defaultTypeResolver, + defaultTypeEmitter, +} from './parser'; +export {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './metadata'; +export {jsonObject} from './json-object'; +export {jsonMember} from './json-member'; +export {jsonArrayMember} from './json-array-member'; +export {jsonSetMember} from './json-set-member'; +export {jsonMapMember} from './json-map-member'; +export {toJson} from './to-json'; +export {ArrayT, SetT, MapT} from './type-descriptor'; diff --git a/src/typedjson/json-array-member.ts b/src/json-array-member.ts similarity index 100% rename from src/typedjson/json-array-member.ts rename to src/json-array-member.ts diff --git a/src/typedjson/json-map-member.ts b/src/json-map-member.ts similarity index 100% rename from src/typedjson/json-map-member.ts rename to src/json-map-member.ts diff --git a/src/typedjson/json-member.ts b/src/json-member.ts similarity index 100% rename from src/typedjson/json-member.ts rename to src/json-member.ts diff --git a/src/typedjson/json-object.ts b/src/json-object.ts similarity index 100% rename from src/typedjson/json-object.ts rename to src/json-object.ts diff --git a/src/typedjson/json-set-member.ts b/src/json-set-member.ts similarity index 100% rename from src/typedjson/json-set-member.ts rename to src/json-set-member.ts diff --git a/src/typedjson/metadata.ts b/src/metadata.ts similarity index 100% rename from src/typedjson/metadata.ts rename to src/metadata.ts diff --git a/src/typedjson/options-base.ts b/src/options-base.ts similarity index 100% rename from src/typedjson/options-base.ts rename to src/options-base.ts diff --git a/src/parser.ts b/src/parser.ts index c9e68d0..7ffd122 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,11 +1,11 @@ -import {defaultTypeResolver, Deserializer} from './typedjson/deserializer'; -import {logError, logWarning, nameof, parseToJSObject} from './typedjson/helpers'; -import {createArrayType} from './typedjson/json-array-member'; -import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './typedjson/metadata'; -import {extractOptionBase, OptionsBase} from './typedjson/options-base'; -import {defaultTypeEmitter, Serializer} from './typedjson/serializer'; -import {ensureTypeDescriptor, MapT, SetT} from './typedjson/type-descriptor'; -import {Constructor, IndexedObject, Serializable} from './typedjson/types'; +import {defaultTypeResolver, Deserializer} from './deserializer'; +import {logError, logWarning, nameof, parseToJSObject} from './helpers'; +import {createArrayType} from './json-array-member'; +import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata'; +import {extractOptionBase, OptionsBase} from './options-base'; +import {defaultTypeEmitter, Serializer} from './serializer'; +import {ensureTypeDescriptor, MapT, SetT} from './type-descriptor'; +import {Constructor, IndexedObject, Serializable} from './types'; export type JsonTypes = Object | boolean | string | number | null | undefined; export {defaultTypeResolver, defaultTypeEmitter}; diff --git a/src/typedjson/serializer.ts b/src/serializer.ts similarity index 100% rename from src/typedjson/serializer.ts rename to src/serializer.ts diff --git a/src/typedjson/to-json.ts b/src/to-json.ts similarity index 97% rename from src/typedjson/to-json.ts rename to src/to-json.ts index e138377..942330e 100644 --- a/src/typedjson/to-json.ts +++ b/src/to-json.ts @@ -1,4 +1,4 @@ -import {TypedJSON} from '../parser'; +import {TypedJSON} from './parser'; /** * Options for the @toJson decorator. diff --git a/src/typedjson/type-descriptor.ts b/src/type-descriptor.ts similarity index 100% rename from src/typedjson/type-descriptor.ts rename to src/type-descriptor.ts diff --git a/src/typedjson.ts b/src/typedjson.ts deleted file mode 100644 index 3849895..0000000 --- a/src/typedjson.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { - TypedJSON, - ITypedJSONSettings, - JsonTypes, - defaultTypeResolver, - defaultTypeEmitter, -} from './parser'; -export {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './typedjson/metadata'; -export {jsonObject} from './typedjson/json-object'; -export {jsonMember} from './typedjson/json-member'; -export {jsonArrayMember} from './typedjson/json-array-member'; -export {jsonSetMember} from './typedjson/json-set-member'; -export {jsonMapMember} from './typedjson/json-map-member'; -export {toJson} from './typedjson/to-json'; -export {ArrayT, SetT, MapT} from './typedjson/type-descriptor'; diff --git a/src/typedjson/types.ts b/src/types.ts similarity index 100% rename from src/typedjson/types.ts rename to src/types.ts diff --git a/tsconfig/README.md b/tsconfig/README.md new file mode 100644 index 0000000..fb154e2 --- /dev/null +++ b/tsconfig/README.md @@ -0,0 +1,33 @@ +# TypedJSON's tsconfig +**[../tsconfig.json](../tsconfig.json)** +Used by IDEs for languages services. + +**[tsconfig.app.json](tsconfig.app.json)** +Used by language services to interpret and check library source code. + +**[tsconfig.app-base.json](tsconfig.app-base.json)** +Governs all library source files. Used as base for production bundles and `tsconfig.app.json`. + +**[tsconfig.base.json](tsconfig.base.json)** +tsconfig.json on which all other configs are based. Used to define settings across the whole +library. + +**[tsconfig.bundle.cjs.json](tsconfig.bundle.cjs.json)** +Production bundle. CommonJS module. Used by Node. `main` field in `package.json`. + +**[tsconfig.bundle.esm.json](tsconfig.bundle.esm.json)** +Production bundle. ECMAScript module with es2015 target. Used by bundlers. `es2015` field in +`package.json`. + +**[tsconfig.bundle.esm5.json](tsconfig.bundle.esm5.json)** +Production bundle. ECMAScript module with es5 target. Used by bundlers. `module` field in +`package.json`. + +**[tsconfig.bundle.types.json](tsconfig.bundle.types.json)** +Production bundle. Generates types. + +**[tsconfig.lint.json](tsconfig.lint.json)** +Used by eslint, see [.eslintrc.yaml](../.eslintrc.yaml). + +**[tsconfig.spec.json](tsconfig.spec.json)** +Governs all test files. diff --git a/tsconfig/tsconfig.app-base.json b/tsconfig/tsconfig.app-base.json new file mode 100644 index 0000000..6df7b30 --- /dev/null +++ b/tsconfig/tsconfig.app-base.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.base.json", + "files": [ + "../src/index.ts" + ] +} diff --git a/tsconfig/tsconfig.app.json b/tsconfig/tsconfig.app.json index 4cb65fd..dfee93a 100644 --- a/tsconfig/tsconfig.app.json +++ b/tsconfig/tsconfig.app.json @@ -1,9 +1,6 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.app-base.json", "compilerOptions": { - "outDir": "../js" - }, - "files": [ - "../src/typedjson.ts" - ] + "noEmit": true + } } diff --git a/tsconfig/tsconfig.base.json b/tsconfig/tsconfig.base.json index d4d106a..ede3f0d 100644 --- a/tsconfig/tsconfig.base.json +++ b/tsconfig/tsconfig.base.json @@ -1,12 +1,18 @@ { "compilerOptions": { - "target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ - "lib": ["es7", "dom"], - "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ + "declaration": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": [ + "dom", + "es5", + "es2015" + ], + "module": "es2015", + "moduleResolution": "Node", + "removeComments": true, + "sourceMap": true, "strict": true, - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ + "target": "ES5" } } diff --git a/tsconfig/tsconfig.bundle.cjs.json b/tsconfig/tsconfig.bundle.cjs.json new file mode 100644 index 0000000..1a7288c --- /dev/null +++ b/tsconfig/tsconfig.bundle.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.app-base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "../lib/cjs", + "target": "es5" + } +} diff --git a/tsconfig/tsconfig.bundle.esm.json b/tsconfig/tsconfig.bundle.esm.json new file mode 100644 index 0000000..76e3e31 --- /dev/null +++ b/tsconfig/tsconfig.bundle.esm.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app-base.json", + "compilerOptions": { + "importHelpers": true, + "module": "es2020", + "outDir": "../lib/esm", + "target": "es2015" + } +} diff --git a/tsconfig/tsconfig.bundle.esm5.json b/tsconfig/tsconfig.bundle.esm5.json new file mode 100644 index 0000000..803cb41 --- /dev/null +++ b/tsconfig/tsconfig.bundle.esm5.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app-base.json", + "compilerOptions": { + "importHelpers": true, + "module": "es2020", + "outDir": "../lib/esm5", + "target": "es5" + } +} diff --git a/tsconfig/tsconfig.bundle.types.json b/tsconfig/tsconfig.bundle.types.json new file mode 100644 index 0000000..36efe08 --- /dev/null +++ b/tsconfig/tsconfig.bundle.types.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.bundle.esm.json", + "compilerOptions": { + "declaration": true, + "declarationDir": "../lib/types", + "declarationMap": true, + "emitDeclarationOnly": true, + "module": "es2015", + "removeComments": false, + "target": "es2020" + } +} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 2b177de..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,59 +0,0 @@ -const path = require('path'); -const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); -const WebpackAutoInject = require('webpack-auto-inject-version'); - -module.exports = { - entry: { - 'typedjson': './src/typedjson.ts', - 'typedjson.min': './src/typedjson.ts', - }, - devtool: 'source-map', - module: { - rules: [ - { - test: /\.[jt]s$/, - use: { - loader: 'ts-loader', - options: { - configFile: 'tsconfig/tsconfig.app.json', - }, - }, - exclude: /node_modules/, - }, - ], - }, - resolve: { - extensions: ['.ts', '.js'], - }, - output: { - filename: '[name].js', - path: path.resolve(__dirname, 'js'), - library: 'typedjson', - libraryTarget: 'umd', - umdNamedDefine: true, - globalObject: `(typeof self !== 'undefined' ? self : this)`, - }, - optimization: { - minimizer: [ - new UglifyJsPlugin({ - include: /\.min\.js$/, - sourceMap: true, - }) - ], - }, - plugins: [ - new WebpackAutoInject({ - SHORT: 'typedjson', - components: { - AutoIncreaseVersion: false, - }, - componentsOptions: { - InjectAsComment: { - tag: 'Version: {version} - {date}', - dateFormat: 'isoDate', - }, - }, - }), - ], - mode: "production", -}; diff --git a/yarn.lock b/yarn.lock index 77e7dbf..742d570 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1239,15 +1239,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -1777,11 +1768,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -1926,7 +1912,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: +enhanced-resolve@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== @@ -2256,13 +2242,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - express@^4.16.3: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -2488,16 +2467,6 @@ find-versions@^3.2.0: dependencies: semver-regex "^2.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -2665,42 +2634,6 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2830,13 +2763,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -2965,14 +2891,6 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - import-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" @@ -3021,16 +2939,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -3264,7 +3172,7 @@ is-typedarray@^1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -3512,12 +3420,22 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.2.3: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -3684,6 +3602,11 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -3704,7 +3627,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -3723,7 +3646,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.0, micromatch@^4.0.2: +micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -3971,6 +3894,21 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -4280,11 +4218,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -4347,6 +4280,13 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -4368,11 +4308,21 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -4908,6 +4858,15 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -5016,21 +4975,6 @@ reserved-words@^0.1.2: resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -5230,11 +5174,6 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^1.7.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -5309,6 +5248,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -5413,7 +5357,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.12: +source-map-support@^0.5.17, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -5548,7 +5492,7 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -5566,6 +5510,14 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.padend@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" + integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" @@ -5605,7 +5557,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -5826,17 +5778,6 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-loader@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58" - integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ== - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^4.0.0" - semver "^6.0.0" - ts-node@^8.10.2: version "8.10.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" @@ -5868,6 +5809,11 @@ tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + tslint@^6.1.2: version "6.1.3" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" @@ -5953,26 +5899,6 @@ typescript@^3.9.7: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== -uglify-js@^3.6.0: - version "3.10.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.3.tgz#f0d2f99736c14de46d2d24649ba328be3e71c3bf" - integrity sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g== - -uglifyjs-webpack-plugin@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7" - integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^1.7.0" - source-map "^0.6.1" - uglify-js "^3.6.0" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -6094,7 +6020,7 @@ uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: +v8-compile-cache@^2.0.3: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== @@ -6147,11 +6073,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-auto-inject-version@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/webpack-auto-inject-version/-/webpack-auto-inject-version-1.2.2.tgz#8fa15f6ea7c4a2a4adcdc5d8b1dc47693dddc971" - integrity sha512-duFSWzZe/OY8zyr2DpymzZeY8yI1RSZ9hu9wDwZy/fhxwntgpEzTwyIB/U7ig+FB26mif8xx5zS1E3Co9c5cYA== - webpack-bundle-analyzer@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" @@ -6171,23 +6092,6 @@ webpack-bundle-analyzer@^3.8.0: opener "^1.5.1" ws "^6.0.0" -webpack-cli@^3.3.10: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" - webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -6196,7 +6100,7 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.41.5, webpack@^4.44.1: +webpack@^4.44.1: version "4.44.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== @@ -6235,7 +6139,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -6261,15 +6165,6 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6328,14 +6223,6 @@ yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -6344,22 +6231,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - yargs@^15.0.2: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" From afc88fab6d7e8adb0d8b2aca81701a29f14c2f50 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 2 Sep 2020 18:48:31 +0000 Subject: [PATCH 057/119] Export options --- src/index.ts | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0852ff3..808472b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,10 +6,26 @@ export { defaultTypeEmitter, } from './parser'; export {TypeResolver, TypeHintEmitter, JsonObjectMetadata} from './metadata'; -export {jsonObject} from './json-object'; -export {jsonMember} from './json-member'; -export {jsonArrayMember} from './json-array-member'; -export {jsonSetMember} from './json-set-member'; -export {jsonMapMember} from './json-map-member'; -export {toJson} from './to-json'; -export {ArrayT, SetT, MapT} from './type-descriptor'; +export { + jsonObject, + IJsonObjectOptions, + InitializerCallback, + IJsonObjectOptionsWithInitializer, + IJsonObjectOptionsBase, +} from './json-object'; +export {jsonMember, IJsonMemberOptions} from './json-member'; +export {jsonArrayMember, IJsonArrayMemberOptions} from './json-array-member'; +export {jsonSetMember, IJsonSetMemberOptions} from './json-set-member'; +export {jsonMapMember, IJsonMapMemberOptions} from './json-map-member'; +export {toJson, IToJsonOptions} from './to-json'; +export { + ArrayT, + SetT, + MapT, + Typelike, + MapOptions, + SetTypeDescriptor, + ArrayTypeDescriptor, + MapTypeDescriptor, +} from './type-descriptor'; +export * from './types'; From fa8dcb880249b7ba0af6495d0ba4e7a7d48b405f Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 24 Dec 2020 00:48:22 +0000 Subject: [PATCH 058/119] Allow debugging tests with run test:inspect --- .github/workflows/nodejs.yml | 2 +- lint-staged.config.js | 2 +- package.json | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 09dc20b..61d884b 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -22,7 +22,7 @@ jobs: yarn install --frozen-lockfile yarn run lint yarn run build - yarn run test + yarn run coverage yarn run size env: CI: true diff --git a/lint-staged.config.js b/lint-staged.config.js index ffaebc0..c976e58 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -5,7 +5,7 @@ function mapFilenames(filenames) { module.exports = { '*': () => [ 'tsc -p tsconfig/tsconfig.app.json', - 'npm run test', + 'yarn run test', ], '*.ts': (filenames) => [ `eslint --fix --cache ${mapFilenames(filenames)}`, diff --git a/package.json b/package.json index 4bedcde..7e0d0b5 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,13 @@ "build": "run-s build:*", "build:clean": "rimraf ./lib", "build:ts": "tsc --build ./tsconfig/tsconfig.bundle.*.json", + "coverage": "nyc yarn run test", "lint": "eslint \"spec/**/*.ts\" \"src/**/*.ts\"", - "preversion": "yarn run test", + "preversion": "yarn run coverage", "size": "size-limit", - "test": "nyc ts-node-transpile-only --project tsconfig/tsconfig.spec.json node_modules/jasmine/bin/jasmine.js", + "test": "yarn run test:base node_modules/jasmine/bin/jasmine.js", + "test:base": "TS_NODE_PROJECT=tsconfig/tsconfig.spec.json node -r ts-node/register", + "test:inspect": "yarn run test:base --inspect-brk node_modules/jasmine/bin/jasmine.js", "version": "yarn run build" }, "repository": { From 9115801bf596a2ef4c6c5893ddae4116c52ad3e8 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 23 Dec 2020 21:02:59 +0000 Subject: [PATCH 059/119] Implement registering of type to serializer map --- spec/mapped-types.spec.ts | 120 ++++++++++++++++++++++++++++++++++++++ src/deserializer.ts | 7 +++ src/parser.ts | 59 +++++++++++++++++++ src/serializer.ts | 8 +++ 4 files changed, 194 insertions(+) create mode 100644 spec/mapped-types.spec.ts diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts new file mode 100644 index 0000000..0de0336 --- /dev/null +++ b/spec/mapped-types.spec.ts @@ -0,0 +1,120 @@ +import {jsonMember, jsonObject, TypedJSON} from '../src'; + +TypedJSON.setGlobalConfig({ + errorHandler: e => { + throw e; + }, +}); + +describe('mapped types', () => { + class CustomType { + value: any; + + constructor(value: any) { + this.value = value; + } + + hasSucceeded(): boolean { + return this.value != null; + } + } + + @jsonObject + class MappedTypesSpec { + + @jsonMember + one: CustomType; + + @jsonMember + two: CustomType; + } + + const testData = { + one: 1, + two: 2, + }; + + describe('global', () => { + TypedJSON.mapType(CustomType, { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }); + + it('deserializes', () => { + const result = TypedJSON.parse(testData, MappedTypesSpec); + + expect(result.one).toBeInstanceOf(CustomType); + expect(result.one.hasSucceeded()).toBeTrue(); + expect(result.two).toBeInstanceOf(CustomType); + expect(result.two.hasSucceeded()).toBeTrue(); + }); + + it('serializes', () => { + const test = new MappedTypesSpec(); + test.one = new CustomType(1); + test.two = new CustomType(2); + const result = TypedJSON.toPlainJson(test, MappedTypesSpec); + + expect(result).toEqual(testData); + }); + }); + + describe('instance', () => { + const typedJson = new TypedJSON(MappedTypesSpec); + typedJson.mapType(CustomType, { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }); + + it('deserializes', () => { + const result = typedJson.parse(testData); + + expect(result.one).toBeInstanceOf(CustomType); + expect(result.one.hasSucceeded()).toBeTrue(); + expect(result.two).toBeInstanceOf(CustomType); + expect(result.two.hasSucceeded()).toBeTrue(); + }); + + it('serializes', () => { + const test = new MappedTypesSpec(); + test.one = new CustomType(1); + test.two = new CustomType(2); + const result = typedJson.toPlainJson(test); + + expect(result).toEqual(testData); + }); + }); + + describe('works with constructor,', () => { + @jsonObject + class MappedTypeWithConstructor { + + @jsonMember({constructor: CustomType}) + nullable: any; + } + + const typedJson = new TypedJSON(MappedTypeWithConstructor); + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + typedJson.mapType(CustomType, CustomTypeMap); + + it('deserializes', () => { + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + const result = typedJson.parse({nullable: 5}); + expect(result.nullable?.hasSucceeded()).toBeTrue(); + expect(result.nullable?.value).toBe(5); + expect(CustomTypeMap.deserializer).toHaveBeenCalled(); + }); + + it('serializes', () => { + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + const object = new MappedTypeWithConstructor(); + object.nullable = new CustomType(5); + const result = typedJson.toPlainJson(object); + expect(CustomTypeMap.serializer).toHaveBeenCalled(); + expect(result).toEqual({nullable: 5}); + }); + }); +}); diff --git a/src/deserializer.ts b/src/deserializer.ts index bf55edb..85be367 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -65,6 +65,13 @@ export class Deserializer { [Uint32Array, convertAsUintArray], ]); + setDeserializationStrategy( + type: Serializable, + deserializer: DeserializerFn, + ) { + this.deserializationStrategy.set(type, deserializer); + } + setNameResolver(nameResolverCallback: (ctor: Function) => string) { this.nameResolver = nameResolverCallback; } diff --git a/src/parser.ts b/src/parser.ts index 7ffd122..e73370d 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -10,6 +10,19 @@ import {Constructor, IndexedObject, Serializable} from './types'; export type JsonTypes = Object | boolean | string | number | null | undefined; export {defaultTypeResolver, defaultTypeEmitter}; +export interface MappedTypeSerializer { + + /** + * Use this deserializer to convert a JSON value to the type. + */ + deserializer: (json: any) => T | null | undefined; + + /** + * Use this serializer to convert a type back to JSON. + */ + serializer: (value: T | null | undefined) => any; +} + export interface ITypedJSONSettings extends OptionsBase { /** * Sets the handler callback to invoke on errors during serializing and deserializing. @@ -18,6 +31,12 @@ export interface ITypedJSONSettings extends OptionsBase { */ errorHandler?: ((e: Error) => void) | null; + /** + * Maps a type to their respective serializer. Prevents you from having to repeat serializers. + * Register additional types with `TypedJSON.mapType`. + */ + mappedTypes?: Map> | null; + /** * Sets a callback that determines the constructor of the correct sub-type of polymorphic * objects while deserializing. @@ -55,6 +74,7 @@ export class TypedJSON { private deserializer: Deserializer = new Deserializer(); private globalKnownTypes: Array> = []; private indent: number = 0; + private mappedTypes = new Map>(); private rootConstructor: Serializable; private errorHandler: (e: Error) => void; private nameResolver: (ctor: Function) => string; @@ -297,6 +317,21 @@ export class TypedJSON { } } + /** + * Map a type to its (de)serializer. + */ + static mapType(type: Serializable, serializer: MappedTypeSerializer): void { + if (this._globalConfig == null) { + this._globalConfig = {}; + } + + if (this._globalConfig.mappedTypes == null) { + this._globalConfig.mappedTypes = new Map(); + } + + this._globalConfig.mappedTypes.set(type, serializer); + } + /** * Configures TypedJSON through a settings object. * @param settings The configuration settings object. @@ -340,6 +375,13 @@ export class TypedJSON { this.indent = settings.indent; } + if (settings.mappedTypes != null) { + this.mappedTypes = settings.mappedTypes; + settings.mappedTypes.forEach((upDown, type) => { + this.setSerializationStrategies(type, upDown); + }); + } + if (settings.nameResolver != null) { this.nameResolver = settings.nameResolver; this.deserializer.setNameResolver(settings.nameResolver); @@ -360,6 +402,11 @@ export class TypedJSON { } } + mapType(type: Serializable, serializer: MappedTypeSerializer): void { + this.mappedTypes.set(type, serializer); + this.setSerializationStrategies(type, serializer); + } + /** * Converts a JSON string to the root class type. * @param object The JSON to parse and convert. @@ -528,4 +575,16 @@ export class TypedJSON { return map; } + + private setSerializationStrategies( + type: Serializable, + serializer: MappedTypeSerializer, + ): void { + this.deserializer.setDeserializationStrategy(type, (value) => { + return serializer.deserializer(value); + }); + this.serializer.setSerializationStrategy(type, (value) => { + return serializer.serializer(value); + }); + } } diff --git a/src/serializer.ts b/src/serializer.ts index 5f59864..d761b3f 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -1,3 +1,4 @@ +import {DeserializerFn} from './deserializer'; import { identity, isInstanceOf, @@ -91,6 +92,13 @@ export class Serializer { [Uint32Array, convertAsTypedArray], ]); + setSerializationStrategy( + type: Serializable, + serializer: SerializerFn, + ) { + this.serializationStrategy.set(type, serializer); + } + setTypeHintEmitter(typeEmitterCallback: TypeHintEmitter) { if (typeof typeEmitterCallback as any !== 'function') { throw new TypeError('\'typeEmitterCallback\' is not a function.'); From 58482193ed0f73e7087f5c60c3531422fccb931e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 24 Dec 2020 17:51:26 +0000 Subject: [PATCH 060/119] Test overwriting transformers of mapped types --- spec/mapped-types.spec.ts | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 0de0336..9206810 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -117,4 +117,45 @@ describe('mapped types', () => { expect(result).toEqual({nullable: 5}); }); }); + + it('can be overwritten with deserializer/serializer prop', () => { + const jsonMemberOptions = { + deserializer: json => new CustomType(0), + serializer: value => 1, + }; + + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + spyOn(jsonMemberOptions, 'serializer').and.callThrough(); + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + spyOn(jsonMemberOptions, 'deserializer').and.callThrough(); + + @jsonObject + class OverriddenSerializer { + @jsonMember(jsonMemberOptions) + overwritten: CustomType; + + @jsonMember + simple: CustomType; + } + + const typedJson = new TypedJSON(OverriddenSerializer); + typedJson.mapType(CustomType, CustomTypeMap); + + const parsed = typedJson.parse({data: 5, simple: 5}); + expect(CustomTypeMap.deserializer).toHaveBeenCalledTimes(1); + expect(jsonMemberOptions.deserializer).toHaveBeenCalledTimes(1); + expect(parsed.overwritten.value).toBe(0); + expect(parsed.simple.value).toBe(5); + + const plain: any = typedJson.toPlainJson(parsed); + expect(CustomTypeMap.serializer).toHaveBeenCalledTimes(1); + expect(jsonMemberOptions.serializer).toHaveBeenCalledTimes(1); + expect(plain.overwritten).toBe(1); + expect(plain.simple).toBe(5); + }); }); From cae66e37b3617380c8576d1bb6c3937679f838d9 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 24 Dec 2020 18:24:45 +0000 Subject: [PATCH 061/119] Test if mapped types work on arrays --- spec/mapped-types.spec.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 9206810..5d66317 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -1,4 +1,4 @@ -import {jsonMember, jsonObject, TypedJSON} from '../src'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; TypedJSON.setGlobalConfig({ errorHandler: e => { @@ -158,4 +158,30 @@ describe('mapped types', () => { expect(plain.overwritten).toBe(1); expect(plain.simple).toBe(5); }); + + it('works on arrays', () => { + @jsonObject + class MappedTypeWithArray { + + @jsonArrayMember(CustomType) + array: Array; + } + + const typedJson = new TypedJSON(MappedTypeWithArray); + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + typedJson.mapType(CustomType, CustomTypeMap); + + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + const parsed = typedJson.parse({array: [1, 5]}); + expect(CustomTypeMap.deserializer).toHaveBeenCalled(); + expect(parsed.array.map(c => c.value)).toEqual([1, 5]); + + const plain: any = typedJson.toPlainJson(parsed); + expect(CustomTypeMap.serializer).toHaveBeenCalled(); + expect(plain.array).toEqual([1, 5]); + }); }); From f5e107aed9857a974e1fa8c9216a8b87da1d62e1 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 16:51:25 +0000 Subject: [PATCH 062/119] Clear global config at end of mapped-type test --- spec/mapped-types.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 5d66317..a163b68 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -185,3 +185,8 @@ describe('mapped types', () => { expect(plain.array).toEqual([1, 5]); }); }); + +TypedJSON.setGlobalConfig({ + errorHandler: () => undefined, +}); + From 9ac939dd262ed405ed19d2a417c9abc799059e3c Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 16:53:17 +0000 Subject: [PATCH 063/119] Increase budget to 8 KB --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e0d0b5..1ea60f6 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "size-limit": [ { "path": "./lib/esm/index.js", - "limit": "6.5 KB" + "limit": "8 KB" } ], "scripts": { From b6bbd77e81b8e5baad16bd773d0a722ed0b69a9e Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 16:54:02 +0000 Subject: [PATCH 064/119] Tighten mappedTypes type --- src/parser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.ts b/src/parser.ts index e73370d..6272850 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -35,7 +35,7 @@ export interface ITypedJSONSettings extends OptionsBase { * Maps a type to their respective serializer. Prevents you from having to repeat serializers. * Register additional types with `TypedJSON.mapType`. */ - mappedTypes?: Map> | null; + mappedTypes?: Map, MappedTypeSerializer> | null; /** * Sets a callback that determines the constructor of the correct sub-type of polymorphic From f2425c7f25bd58062bde9ed1c4bbe30866813a71 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 17:00:21 +0000 Subject: [PATCH 065/119] Remove unused TypedJSON.mappedTypes --- src/parser.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 6272850..8aa5750 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -74,7 +74,6 @@ export class TypedJSON { private deserializer: Deserializer = new Deserializer(); private globalKnownTypes: Array> = []; private indent: number = 0; - private mappedTypes = new Map>(); private rootConstructor: Serializable; private errorHandler: (e: Error) => void; private nameResolver: (ctor: Function) => string; @@ -376,7 +375,6 @@ export class TypedJSON { } if (settings.mappedTypes != null) { - this.mappedTypes = settings.mappedTypes; settings.mappedTypes.forEach((upDown, type) => { this.setSerializationStrategies(type, upDown); }); @@ -403,7 +401,6 @@ export class TypedJSON { } mapType(type: Serializable, serializer: MappedTypeSerializer): void { - this.mappedTypes.set(type, serializer); this.setSerializationStrategies(type, serializer); } From d063734b73e3e5596633643e4f4ed6a69badcc3d Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 17:07:13 +0000 Subject: [PATCH 066/119] Initialize TypedJSON._globalConfig --- src/parser.ts | 44 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 8aa5750..a8e1803 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -68,7 +68,7 @@ export interface ITypedJSONSettings extends OptionsBase { export class TypedJSON { - private static _globalConfig: ITypedJSONSettings | null | undefined; + private static _globalConfig: ITypedJSONSettings = {}; private serializer: Serializer = new Serializer(); private deserializer: Deserializer = new Deserializer(); @@ -99,11 +99,7 @@ export class TypedJSON { this.rootConstructor = rootConstructor; this.errorHandler = (error) => logError(error); - if (settings !== undefined) { - this.config(settings); - } else if (TypedJSON._globalConfig !== undefined) { - this.config({}); - } + this.config(settings); } static parse( @@ -309,21 +305,13 @@ export class TypedJSON { } static setGlobalConfig(config: ITypedJSONSettings) { - if (this._globalConfig == null) { - this._globalConfig = config; - } else { - Object.assign(this._globalConfig, config); - } + Object.assign(this._globalConfig, config); } /** * Map a type to its (de)serializer. */ static mapType(type: Serializable, serializer: MappedTypeSerializer): void { - if (this._globalConfig == null) { - this._globalConfig = {}; - } - if (this._globalConfig.mappedTypes == null) { this._globalConfig.mappedTypes = new Map(); } @@ -335,20 +323,18 @@ export class TypedJSON { * Configures TypedJSON through a settings object. * @param settings The configuration settings object. */ - config(settings: ITypedJSONSettings) { - if (TypedJSON._globalConfig != null) { - settings = { - ...TypedJSON._globalConfig, - ...settings, - }; - - if (settings.knownTypes != null - && TypedJSON._globalConfig.knownTypes != null) { - // Merge known-types (also de-duplicate them, so Array -> Set -> Array). - settings.knownTypes = Array.from(new Set( - settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes), - )); - } + config(settings?: ITypedJSONSettings) { + settings = { + ...TypedJSON._globalConfig, + ...settings, + }; + + if (settings.knownTypes != null + && TypedJSON._globalConfig.knownTypes != null) { + // Merge known-types (also de-duplicate them, so Array -> Set -> Array). + settings.knownTypes = Array.from(new Set( + settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes), + )); } const options = extractOptionBase(settings); From d1b3a798ac8f1cd1a460c8b423fef61770fd1be6 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 17:18:19 +0000 Subject: [PATCH 067/119] Rename MappedTypeSerializer -> MappedTypeConverters This should decrease confusion with things like serializer.serializer. --- src/parser.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index a8e1803..8a10f3f 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -10,7 +10,7 @@ import {Constructor, IndexedObject, Serializable} from './types'; export type JsonTypes = Object | boolean | string | number | null | undefined; export {defaultTypeResolver, defaultTypeEmitter}; -export interface MappedTypeSerializer { +export interface MappedTypeConverters { /** * Use this deserializer to convert a JSON value to the type. @@ -32,10 +32,10 @@ export interface ITypedJSONSettings extends OptionsBase { errorHandler?: ((e: Error) => void) | null; /** - * Maps a type to their respective serializer. Prevents you from having to repeat serializers. - * Register additional types with `TypedJSON.mapType`. + * Maps a type to their respective (de)serializer. Prevents you from having to repeat + * (de)serializers. Register additional types with `TypedJSON.mapType`. */ - mappedTypes?: Map, MappedTypeSerializer> | null; + mappedTypes?: Map, MappedTypeConverters> | null; /** * Sets a callback that determines the constructor of the correct sub-type of polymorphic @@ -311,12 +311,12 @@ export class TypedJSON { /** * Map a type to its (de)serializer. */ - static mapType(type: Serializable, serializer: MappedTypeSerializer): void { + static mapType(type: Serializable, converters: MappedTypeConverters): void { if (this._globalConfig.mappedTypes == null) { this._globalConfig.mappedTypes = new Map(); } - this._globalConfig.mappedTypes.set(type, serializer); + this._globalConfig.mappedTypes.set(type, converters); } /** @@ -386,8 +386,8 @@ export class TypedJSON { } } - mapType(type: Serializable, serializer: MappedTypeSerializer): void { - this.setSerializationStrategies(type, serializer); + mapType(type: Serializable, converters: MappedTypeConverters): void { + this.setSerializationStrategies(type, converters); } /** @@ -561,13 +561,13 @@ export class TypedJSON { private setSerializationStrategies( type: Serializable, - serializer: MappedTypeSerializer, + converters: MappedTypeConverters, ): void { this.deserializer.setDeserializationStrategy(type, (value) => { - return serializer.deserializer(value); + return converters.deserializer(value); }); this.serializer.setSerializationStrategy(type, (value) => { - return serializer.serializer(value); + return converters.serializer(value); }); } } From e06a28d10e9d265dd039e29f138803c45ad4a820 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 17:53:52 +0000 Subject: [PATCH 068/119] Allow mapping only (de)serializer --- spec/mapped-types.spec.ts | 42 +++++++++++++++++++++++++++++++++++++++ src/parser.ts | 21 ++++++++++++-------- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index a163b68..9f1c74b 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -6,6 +6,9 @@ TypedJSON.setGlobalConfig({ }, }); +const date2000 = '2000-01-01T00:00:00.000Z'; +const date3000 = '3000-01-01T00:00:00.000Z'; + describe('mapped types', () => { class CustomType { value: any; @@ -159,6 +162,45 @@ describe('mapped types', () => { expect(plain.simple).toBe(5); }); + it('should use default when only mapping deserializer', () => { + @jsonObject + class OnlyDeSerializer { + @jsonMember + date: Date; + } + + const typedJson = new TypedJSON(OnlyDeSerializer); + typedJson.mapType(Date, { + deserializer: value => new Date(new Date(value).setFullYear(3000)), + }); + + const parsed = typedJson.parse({date: date2000}); + + expect(parsed.date.toISOString()).toEqual(date3000); + expect((typedJson.toPlainJson(parsed) as any).date.toString()) + .toEqual(new Date(date3000).toString()); + }); + + it('should use default when only mapping serializer', () => { + @jsonObject + class OnlySerializer { + @jsonMember + date: Date; + } + + const typedJson = new TypedJSON(OnlySerializer); + typedJson.mapType(Date, { + serializer: value => new Date(value.setFullYear(3000)).toISOString(), + }); + + const test = new OnlySerializer(); + test.date = new Date(date2000); + const result = typedJson.toPlainJson(test); + + expect(result).toEqual({date: date3000}); + expect(typedJson.parse({date: date2000}).date.toISOString()).toEqual(date2000); + }); + it('works on arrays', () => { @jsonObject class MappedTypeWithArray { diff --git a/src/parser.ts b/src/parser.ts index 8a10f3f..86b1597 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -15,12 +15,12 @@ export interface MappedTypeConverters { /** * Use this deserializer to convert a JSON value to the type. */ - deserializer: (json: any) => T | null | undefined; + deserializer?: ((json: any) => T | null | undefined) | null; /** * Use this serializer to convert a type back to JSON. */ - serializer: (value: T | null | undefined) => any; + serializer?: ((value: T | null | undefined) => any) | null; } export interface ITypedJSONSettings extends OptionsBase { @@ -563,11 +563,16 @@ export class TypedJSON { type: Serializable, converters: MappedTypeConverters, ): void { - this.deserializer.setDeserializationStrategy(type, (value) => { - return converters.deserializer(value); - }); - this.serializer.setSerializationStrategy(type, (value) => { - return converters.serializer(value); - }); + if (converters.deserializer != null) { + this.deserializer.setDeserializationStrategy(type, (value) => { + return converters.deserializer!(value); + }); + } + + if (converters.serializer != null) { + this.serializer.setSerializationStrategy(type, (value) => { + return converters.serializer!(value); + }); + } } } From 7b4fe246b06e4410179110704b40eea18f70a490 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sun, 3 Jan 2021 18:54:11 +0000 Subject: [PATCH 069/119] Test mapping Array type --- spec/mapped-types.spec.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 9f1c74b..30761c8 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -201,6 +201,33 @@ describe('mapped types', () => { expect(typedJson.parse({date: date2000}).date.toISOString()).toEqual(date2000); }); + it('should handle mapping arrays', () => { + @jsonObject + class MappedTypeWithArray { + + @jsonArrayMember(String) + array: Array; + } + + const typedJson = new TypedJSON(MappedTypeWithArray); + const ArrayTypeMap = { + deserializer: json => ['deserialized'], + serializer: value => ['serialized'], + }; + + typedJson.mapType(Array, ArrayTypeMap); + + spyOn(ArrayTypeMap, 'serializer').and.callThrough(); + spyOn(ArrayTypeMap, 'deserializer').and.callThrough(); + const parsed = typedJson.parse({array: ['hello']}); + expect(ArrayTypeMap.deserializer).toHaveBeenCalled(); + expect(parsed.array).toEqual(['deserialized']); + + const plain: any = typedJson.toPlainJson(parsed); + expect(ArrayTypeMap.serializer).toHaveBeenCalled(); + expect(plain.array).toEqual(['serialized']); + }); + it('works on arrays', () => { @jsonObject class MappedTypeWithArray { From 8accf9e0fcfa3142f4c01495b5dcb2f8d8c0df0b Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 23 Dec 2020 21:47:21 +0000 Subject: [PATCH 070/119] Test whether undeterminable types throw errors --- spec/errors.spec.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 spec/errors.spec.ts diff --git a/spec/errors.spec.ts b/spec/errors.spec.ts new file mode 100644 index 0000000..d122c82 --- /dev/null +++ b/spec/errors.spec.ts @@ -0,0 +1,24 @@ +import {jsonMember, jsonObject, TypedJSON} from '../src'; + +describe('errors', () => { + class CustomType { + } + + it('should be thrown when types could not be determined', () => { + @jsonObject + class TestNonDeterminableTypes { + + @jsonMember + bar: CustomType; + } + + const typedJson = new TypedJSON(TestNonDeterminableTypes); + typedJson.config({ + errorHandler: e => { + throw e; + }, + }); + + expect(() => typedJson.parse({bar: 'bar'})).toThrow(); + }); +}); From 205ebcf0c0b9ec1e687c1f73112f9b785900bb63 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 23 Dec 2020 21:47:52 +0000 Subject: [PATCH 071/119] Include name of type which could not be determined in error --- src/deserializer.ts | 11 ++++++++--- src/serializer.ts | 11 ++++++++--- src/type-descriptor.ts | 4 ++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/deserializer.ts b/src/deserializer.ts index 85be367..2b16756 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -128,9 +128,14 @@ export class Deserializer { if (typeof sourceObject === 'object') { return convertAsObject(sourceObject, typeDescriptor, knownTypes, memberName, this); } - this.errorHandler(new TypeError( - `Could not deserialize '${memberName}': don't know how to deserialize this type'.`, - )); + + let error = `Could not deserialize '${memberName}'; don't know how to deserialize type`; + + if (typeDescriptor.hasFriendlyName()) { + error += ` '${typeDescriptor.ctor.name}'`; + } + + this.errorHandler(new TypeError(`${error}.`)); } instantiateType(ctor: any) { diff --git a/src/serializer.ts b/src/serializer.ts index d761b3f..f8a315f 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -163,9 +163,14 @@ export class Serializer { if (typeof sourceObject === 'object') { return convertAsObject(sourceObject, typeDescriptor, memberName, this, memberOptions); } - this.errorHandler(new TypeError( - `Could not serialize '${memberName}': don't know how to serialize this type'.`, - )); + + let error = `Could not serialize '${memberName}'; don't know how to serialize type`; + + if (typeDescriptor.hasFriendlyName()) { + error += ` '${typeDescriptor.ctor.name}'`; + } + + this.errorHandler(new TypeError(`${error}.`)); } } diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index a0e2a2d..ac8810d 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -5,6 +5,10 @@ export abstract class TypeDescriptor { getTypes(): Array { return [this.ctor]; } + + hasFriendlyName(): boolean { + return this.ctor.name !== 'Object'; + } } export type Typelike = TypeDescriptor | Function; From 709684d8e31065975f41b374d62cb345c015be1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Mon, 4 Jan 2021 01:14:25 +0100 Subject: [PATCH 072/119] Release 1.6.0-rc3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ea60f6..e09dc76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0-rc2", + "version": "1.6.0-rc3", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 6b4582cf0e6b9a7ca4c469f045134da97f894b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Thu, 7 Jan 2021 00:01:23 +0100 Subject: [PATCH 073/119] v1.6.0-rc4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e09dc76..42cf9cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0-rc3", + "version": "1.6.0-rc4", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 01fda862b24fc874a7712346a77fcf08429a6548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Fri, 22 Jan 2021 00:59:58 +0100 Subject: [PATCH 074/119] 1.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42cf9cd..6d12918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0-rc4", + "version": "1.6.0", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From db94eee41abd88827a68d2c5242809c40fddf557 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 16 Jan 2021 11:19:24 +0000 Subject: [PATCH 075/119] Implement lazy types --- readme.md | 54 +++--- spec/array.spec.ts | 12 +- spec/base.spec.ts | 4 +- spec/custom-deserializer.spec.ts | 4 +- spec/custom-serializer.spec.ts | 4 +- spec/just-json.spec.ts | 2 +- spec/lazy-types/lazy-types.spec.ts | 168 +++++++++++++++++++ spec/map.spec.ts | 4 +- spec/mapped-types.spec.ts | 6 +- spec/polymorphism-abstract-class.spec.ts | 6 +- spec/polymorphism-custom-names.spec.ts | 2 +- spec/polymorphism-custom-type-hints.spec.ts | 2 +- spec/polymorphism-interface.spec.ts | 8 +- spec/polymorphism-nested-arrays.spec.ts | 8 +- spec/polymorphism.spec.ts | 2 +- spec/preserve-null.spec.ts | 4 +- spec/set.spec.ts | 8 +- src/deserializer.ts | 9 +- src/helpers.ts | 5 +- src/index.ts | 1 + src/json-array-member.ts | 14 +- src/json-map-member.ts | 23 +-- src/json-member.ts | 175 +++++++++----------- src/json-set-member.ts | 14 +- src/metadata.ts | 11 +- src/serializer.ts | 4 +- src/type-descriptor.ts | 3 + src/types.ts | 4 + 28 files changed, 354 insertions(+), 207 deletions(-) create mode 100644 spec/lazy-types/lazy-types.spec.ts diff --git a/readme.md b/readme.md index 61812f6..ed92ecb 100644 --- a/readme.md +++ b/readme.md @@ -78,13 +78,13 @@ import { jsonObject, jsonArrayMember, jsonSetMember, jsonMapMember, TypedJSON } @jsonObject class MyDataClass { - @jsonArrayMember(Number) + @jsonArrayMember(() => Number) public prop1: number[]; - @jsonSetMember(String) + @jsonSetMember(() => String) public prop2: Set; - @jsonMapMember(Number, MySecondDataClass) + @jsonMapMember(() => Number, () => MySecondDataClass) public prop3: Map; } ``` @@ -117,14 +117,27 @@ class MyDataClass @jsonMember public prop1: MySecondDataClass; - @jsonArrayMember(MySecondDataClass) + @jsonArrayMember(() => MySecondDataClass) public arrayProp: MySecondDataClass[]; - @jsonMapMember(Number, MySecondDataClass) + @jsonMapMember(() => Number, () => MySecondDataClass) public mapProp: Map; } ``` +### Any type +In case you don't want TypedJSON to make any conversion the `Any` type can be used. + +```typescript +import {Any, jsonObject, jsonMember} from 'typedjson'; + +@jsonObject +class Something { + @jsonMember(() => Any) + anythingGoes: any; +} +``` + ### Using without ReflectDecorators Without ReflectDecorators, `@jsonMember` requires an additional type argument, because TypeScript cannot infer it automatically: @@ -137,11 +150,11 @@ Without ReflectDecorators, `@jsonMember` requires an additional type argument, b class MyDataClass { - @jsonMember -+ @jsonMember({ constructor: Number }) ++ @jsonMember(() => Number) public prop1: number; - @jsonMember -+ @jsonMember({ constructor: MySecondDataClass }) ++ @jsonMember(() => MySecondDataClass) public prop2: MySecondDataClass; } ``` @@ -254,37 +267,14 @@ import { jsonObject, jsonArrayMember, TypedJSON } from 'typedjson'; @jsonObject class MyDataClass { - @jsonArrayMember(Number, { dimensions: 2 }) + @jsonArrayMember(() => Number, { dimensions: 2 }) public prop1: number[][]; - @jsonArrayMember(Number, { dimensions: 3 }) + @jsonArrayMember(() => Number, { dimensions: 3 }) public prop2: number[][][]; } ``` -### Class declaration order matters - -When referencing a class in a nested object structure, the referenced class must be declared in advance, e.g.: - -```typescript -import 'reflect-metadata'; -import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from 'typedjson'; - -@jsonObject -class Employee -{ - @jsonMember - public name: string; -} - -@jsonObject -class Company -{ - @jsonArrayMember(Employee) - public employees: Employee[]; -} -``` - ### No inferred property types If using ReflectDecorators to infer the constructor (type) of properties, it's always required to manually specify the property type: diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 94e7377..61609e0 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {Any, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {Everything, IEverything} from './utils/everything'; describe('array of objects', () => { @@ -73,16 +73,16 @@ describe('multidimensional arrays', () => { @jsonObject class WithArrays implements IWithArrays { - @jsonArrayMember(Everything) + @jsonArrayMember(() => Everything) one: Array; - @jsonArrayMember(Everything, {dimensions: 2}) + @jsonArrayMember(() => Everything, {dimensions: 2}) two: Array>; - @jsonArrayMember(Everything, {dimensions: 6}) + @jsonArrayMember(() => Everything, {dimensions: 6}) deep: Array>>>>>; - @jsonArrayMember(WithArrays, {dimensions: 2}) + @jsonArrayMember(() => WithArrays, {dimensions: 2}) arrayWithArray?: Array>; constructor(init?: IWithArrays) { @@ -170,7 +170,7 @@ describe('multidimensional arrays', () => { describe('array of raw objects', () => { @jsonObject class Translations { - @jsonArrayMember(Object) + @jsonArrayMember(() => Any) localization: Array; } diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 6eef90b..6874d64 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -143,7 +143,7 @@ describe('basic serialization of', () => { @jsonMember bool: boolean = true; - @jsonArrayMember(String) + @jsonArrayMember(() => String) arr: Array = []; @jsonMember @@ -170,7 +170,7 @@ describe('basic serialization of', () => { @jsonMember bool: boolean; - @jsonArrayMember(String) + @jsonArrayMember(() => String) arr: Array; @jsonMember diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index 75b8cc3..2cf11be 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -41,7 +41,7 @@ describe('custom member deserializer', () => { describe('custom array member deserializer', () => { @jsonObject class Obj { - @jsonArrayMember(Number, { + @jsonArrayMember(() => Number, { deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10)), }) nums: Array; @@ -103,7 +103,7 @@ describe('custom delegating array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(Inner, {deserializer: objArrayDeserializer}) + @jsonArrayMember(() => Inner, {deserializer: objArrayDeserializer}) inners: Array; @jsonMember diff --git a/spec/custom-serializer.spec.ts b/spec/custom-serializer.spec.ts index e349e93..e0eb092 100644 --- a/spec/custom-serializer.spec.ts +++ b/spec/custom-serializer.spec.ts @@ -39,7 +39,7 @@ describe('custom member serializer', () => { describe('custom array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(Number, {serializer: (values: Array) => values.join(',')}) + @jsonArrayMember(() => Number, {serializer: (values: Array) => values.join(',')}) nums: Array; @jsonMember @@ -97,7 +97,7 @@ describe('custom delegating array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(Inner, {serializer: objArraySerializer}) + @jsonArrayMember(() => Inner, {serializer: objArraySerializer}) inners: Array; @jsonMember diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index 50f4f13..a1f77ab 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -63,7 +63,7 @@ describe('json (without automatic stringify)', () => { propStr: String; @jsonMember propNum: number; - @jsonArrayMember(String) + @jsonArrayMember(() => String) propArr: Array; @jsonMember propDate: Date; diff --git a/spec/lazy-types/lazy-types.spec.ts b/spec/lazy-types/lazy-types.spec.ts new file mode 100644 index 0000000..f02614f --- /dev/null +++ b/spec/lazy-types/lazy-types.spec.ts @@ -0,0 +1,168 @@ +import { + jsonArrayMember, + jsonMapMember, + jsonMember, + jsonObject, + jsonSetMember, + TypedJSON, +} from '../../src'; + +describe('Lazy types', () => { + describe('simple member', () => { + @jsonObject + class Root { + + @jsonMember(() => Lazy) + lazy: Lazy; + } + + @jsonObject + class Lazy { + + @jsonMember + name: string; + } + + const typedJson = new TypedJSON(Root); + + it('should deserialize', () => { + const result = typedJson.parse({ + lazy: { + name: 'hello', + }, + }); + + expect(result.lazy).toBeInstanceOf(Lazy); + expect(result.lazy.name).toBe('hello'); + }); + + it('should serialize', () => { + const root = new Root(); + root.lazy = new Lazy(); + root.lazy.name = 'hello'; + const result: any = typedJson.toPlainJson(root); + + expect(result.lazy.name).toBe('hello'); + }); + }); + + describe('array member', () => { + @jsonObject + class Root { + + @jsonArrayMember(() => Lazy) + lazy: Array; + } + + @jsonObject + class Lazy { + + @jsonMember + name: string; + } + + const typedJson = new TypedJSON(Root); + + it('should deserialize', () => { + const result = typedJson.parse({ + lazy: [{name: 'hello'}], + }); + + expect(result.lazy.length).toBe(1); + expect(result.lazy[0]).toBeInstanceOf(Lazy); + expect(result.lazy[0].name).toBe('hello'); + }); + + it('should serialize', () => { + const root = new Root(); + const lazy = new Lazy(); + lazy.name = 'hello'; + root.lazy = [lazy]; + const result: any = typedJson.toPlainJson(root); + + expect(result.lazy.length).toBe(1); + expect(result.lazy[0].name).toBe('hello'); + }); + }); + + describe('map member', () => { + @jsonObject + class Root { + + @jsonMapMember(() => String, () => LazyValue) + lazy: Map; + } + + @jsonObject + class LazyValue { + + @jsonMember + name: string; + } + + const typedJson = new TypedJSON(Root); + + it('should deserialize', () => { + const result = typedJson.parse({ + lazy: [{key: 'key', value: {name: 'hello'}}], + }); + + expect(result.lazy.size).toBe(1); + expect(result.lazy).toBeInstanceOf(Map); + expect(result.lazy.get('key')).toBeInstanceOf(LazyValue); + expect(result.lazy.get('key').name).toBe('hello'); + }); + + it('should serialize', () => { + const root = new Root(); + const lazy = new LazyValue(); + lazy.name = 'hello'; + root.lazy = new Map([['key', lazy]]); + const result: any = typedJson.toPlainJson(root); + + expect(result.lazy.length).toBe(1); + expect(result.lazy[0].key).toBe('key'); + expect(result.lazy[0].value.name).toBe('hello'); + }); + }); + + describe('set member', () => { + @jsonObject + class Root { + + @jsonSetMember(() => Lazy) + lazy: Set; + } + + @jsonObject + class Lazy { + + @jsonMember + name: string; + } + + const typedJson = new TypedJSON(Root); + + it('should deserialize', () => { + const result = typedJson.parse({ + lazy: [{name: 'hello'}], + }); + + expect(result.lazy.size).toBe(1); + expect(result.lazy).toBeInstanceOf(Set); + expect(result.lazy.values().next().value).toBeInstanceOf(Lazy); + expect(result.lazy.values().next().value.name).toBe('hello'); + }); + + it('should serialize', () => { + const root = new Root(); + const lazy = new Lazy(); + lazy.name = 'hello'; + root.lazy = new Set([lazy]); + const result: any = typedJson.toPlainJson(root); + + expect(result.lazy.length).toBe(1); + expect(result.lazy[0].name).toBe('hello'); + }); + }); +}); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index 3e22643..7e38972 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -27,7 +27,7 @@ describe('map dictionary shape', () => { @jsonObject class DictMap { - @jsonMapMember(String, Simple, {shape: MapShape.OBJECT}) + @jsonMapMember(() => String, () => Simple, {shape: MapShape.OBJECT}) prop: Map; getSetSize() { @@ -97,7 +97,7 @@ describe('map of array dictionary shape', () => { @jsonObject class DictArrayMap { - @jsonMapMember(String, ArrayT(Simple), {shape: MapShape.OBJECT}) + @jsonMapMember(() => String, () => ArrayT(Simple), {shape: MapShape.OBJECT}) prop: Map>; getSetSize() { diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 30761c8..1e62b84 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -92,7 +92,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithConstructor { - @jsonMember({constructor: CustomType}) + @jsonMember(() => CustomType) nullable: any; } @@ -205,7 +205,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithArray { - @jsonArrayMember(String) + @jsonArrayMember(() => String) array: Array; } @@ -232,7 +232,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithArray { - @jsonArrayMember(CustomType) + @jsonArrayMember(() => CustomType) array: Array; } diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 23d5ffb..57a85eb 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -18,10 +18,10 @@ describe('polymorphic abstract classes', () => { @jsonObject class BigNode extends Node { - @jsonArrayMember(String) + @jsonArrayMember(() => String) inputs: Array; - @jsonArrayMember(String) + @jsonArrayMember(() => String) outputs: Array; constructor() { @@ -35,7 +35,7 @@ describe('polymorphic abstract classes', () => { knownTypes: [BigNode, SmallNode], }) class Graph { - @jsonArrayMember(Node) + @jsonArrayMember(() => Node) nodes: Array; @jsonMember diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 7399494..52ec9dc 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -64,7 +64,7 @@ describe('polymorphic custom names', () => { @jsonMember name: string; - @jsonArrayMember(Employee, {name: 'company-employees'}) + @jsonArrayMember(() => Employee, {name: 'company-employees'}) employees: Array; @jsonMember diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index 0d2c27c..fc9557b 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -73,7 +73,7 @@ describe('polymorphism custom type hints', () => { @jsonMember name: string; - @jsonArrayMember(Employee) + @jsonArrayMember(() => Employee) employees: Array = []; @jsonMember diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index 4ea400e..cc763ea 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,4 +1,4 @@ -import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {Any, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic interfaces', () => { @@ -30,10 +30,10 @@ describe('polymorphic interfaces', () => { @jsonMember y: number; - @jsonArrayMember(String) + @jsonArrayMember(() => String) inputs: Array; - @jsonArrayMember(String) + @jsonArrayMember(() => String) outputs: Array; constructor() { @@ -46,7 +46,7 @@ describe('polymorphic interfaces', () => { knownTypes: [BigNode, SmallNode], }) class GraphGrid { - @jsonArrayMember(Object) + @jsonArrayMember(() => Any) points: Array; @jsonMember diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index 71c7168..3ebc255 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -18,10 +18,10 @@ describe('polymorphism in nested arrays', () => { @jsonObject class BigNode extends Node { - @jsonArrayMember(String) + @jsonArrayMember(() => String) inputs: Array; - @jsonArrayMember(String) + @jsonArrayMember(() => String) outputs: Array; constructor() { @@ -33,10 +33,10 @@ describe('polymorphism in nested arrays', () => { @jsonObject({knownTypes: [BigNode, SmallNode]}) class Graph { - @jsonArrayMember(Node, {dimensions: 2}) + @jsonArrayMember(() => Node, {dimensions: 2}) items: Array>; - @jsonArrayMember(SmallNode, {dimensions: 2}) + @jsonArrayMember(() => SmallNode, {dimensions: 2}) smallItems: Array>; constructor() { diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 6a0fd6e..4685c70 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -66,7 +66,7 @@ describe('polymorphism', () => { @jsonMember name: string; - @jsonArrayMember(Employee) + @jsonArrayMember(() => Employee) employees: Array; @jsonMember diff --git a/spec/preserve-null.spec.ts b/spec/preserve-null.spec.ts index c7e3fea..8a872d6 100644 --- a/spec/preserve-null.spec.ts +++ b/spec/preserve-null.spec.ts @@ -156,7 +156,7 @@ describe('preserveNull', () => { it('should preserve nulls in array', () => { @jsonObject class Person { - @jsonArrayMember(String, {preserveNull: true}) + @jsonArrayMember(() => String, {preserveNull: true}) names: Array; } @@ -171,7 +171,7 @@ describe('preserveNull', () => { it('should preserve nulls in maps', () => { @jsonObject class Person { - @jsonMapMember(String, String, {preserveNull: true}) + @jsonMapMember(() => String, () => String, {preserveNull: true}) map: Map; } diff --git a/spec/set.spec.ts b/spec/set.spec.ts index 39b8056..d3a7e57 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,4 +1,4 @@ -import {ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; +import {Any, ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; import {Everything} from './utils/everything'; describe('set of objects', () => { @@ -67,7 +67,7 @@ describe('set of objects', () => { describe('set member', () => { @jsonObject class WithSet { - @jsonSetMember(Everything) + @jsonSetMember(() => Everything) prop: Set; getSetSize() { @@ -119,7 +119,7 @@ describe('set array member', () => { @jsonObject class WithSet { - @jsonMember({constructor: SetT(ArrayT(Simple))}) + @jsonMember(() => SetT(ArrayT(Simple))) prop: Set>; getSetSize() { @@ -202,7 +202,7 @@ describe('set array member', () => { describe('set of raw objects', () => { @jsonObject class WithRawSet { - @jsonSetMember(Object) + @jsonSetMember(() => Any) rawSet: Set; } diff --git a/src/deserializer.ts b/src/deserializer.ts index 2b16756..682ce21 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -2,6 +2,7 @@ import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers'; import {JsonObjectMetadata, TypeResolver} from './metadata'; import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { + Any, ArrayTypeDescriptor, ConcreteTypeDescriptor, MapShape, @@ -44,6 +45,7 @@ export class Deserializer { DeserializerFn >([ // primitives + [Any, (sourceObject) => sourceObject], [Number, deserializeDirectly], [String, deserializeDirectly], [Boolean, deserializeDirectly], @@ -252,6 +254,11 @@ function convertAsObject( let typeResolver = deserializer.getTypeResolver(); if (sourceObjectMetadata !== undefined) { + sourceObjectMetadata.knownTypesDeferred.forEach(typeThunk => { + typeThunk().getTypes().forEach(ctor => sourceObjectMetadata!.knownTypes.add(ctor)); + }); + sourceObjectMetadata.knownTypesDeferred = []; + // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = deserializer.mergeKnownTypes( knownTypeConstructors, @@ -307,7 +314,7 @@ function convertAsObject( } else { revivedValue = deserializer.convertSingleValue( objMemberValue, - objMemberMetadata.type, + objMemberMetadata.type(), knownTypeConstructors, objMemberDebugName, objMemberOptions, diff --git a/src/helpers.ts b/src/helpers.ts index ce627f6..8b8a8e3 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,3 +1,4 @@ +import {Any} from './type-descriptor'; import {Serializable} from './types'; declare abstract class Reflect { @@ -108,7 +109,9 @@ export function isValueDefined(value: T): value is Exclude(value: any, constructor: Function): boolean { - if (typeof value === 'number') { + if (constructor === Any) { + return true; + } else if (typeof value === 'number') { return constructor === Number; } else if (typeof value === 'string') { return constructor === String; diff --git a/src/index.ts b/src/index.ts index 808472b..5f4d825 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ export {jsonMapMember, IJsonMapMemberOptions} from './json-map-member'; export {toJson, IToJsonOptions} from './to-json'; export { ArrayT, + Any, SetT, MapT, Typelike, diff --git a/src/json-array-member.ts b/src/json-array-member.ts index 5651af5..7da2956 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -7,6 +7,7 @@ import { isTypelike, TypeDescriptor, } from './type-descriptor'; +import {TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -37,25 +38,18 @@ export interface IJsonArrayMemberOptions extends OptionsBase { /** * Specifies that a property, of type array, is part of an object when serializing. - * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * @param typeThunk Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' * for 'Date[]'). * @param options Additional options. */ export function jsonArrayMember( - elementConstructor: Function | TypeDescriptor, + typeThunk: TypeThunk, options: IJsonArrayMemberOptions = {}, ) { return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; - if (!isTypelike(elementConstructor)) { - logError( - `${decoratorName}: could not resolve constructor of array elements at runtime.`, - ); - return; - } - const dimensions = options.dimensions == null ? 1 : options.dimensions; if (!isNaN(dimensions) && dimensions < 1) { logError(`${decoratorName}: 'dimensions' option must be at least 1.`); @@ -71,7 +65,7 @@ export function jsonArrayMember( } injectMetadataInformation(target, propKey, { - type: createArrayType(ensureTypeDescriptor(elementConstructor), dimensions), + type: () => createArrayType(ensureTypeDescriptor(typeThunk()), dimensions), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 2df1b6d..600b937 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -1,7 +1,8 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {isTypelike, MapOptions, MapT, TypeDescriptor} from './type-descriptor'; +import {MapOptions, MapT} from './type-descriptor'; +import {TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -30,29 +31,19 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Map. - * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map'). - * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map'). + * @param keyThunk Constructor of map keys (e.g. 'Number' for 'Map'). + * @param valueThunk Constructor of map values (e.g. 'Date' for 'Map'). * @param options Additional options. */ export function jsonMapMember( - keyConstructor: Function | TypeDescriptor, - valueConstructor: Function | TypeDescriptor, + keyThunk: TypeThunk, + valueThunk: TypeThunk, options: IJsonMapMemberOptions = {}, ) { return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; - if (!isTypelike(keyConstructor)) { - logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`); - return; - } - - if (!isTypelike(valueConstructor)) { - logError(`${decoratorName}: could not resolve constructor of map values at runtime.`); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used // on a map. Warn if not. if (isReflectMetadataSupported @@ -62,7 +53,7 @@ export function jsonMapMember( } injectMetadataInformation(target, propKey, { - type: MapT(keyConstructor, valueConstructor, {shape: options.shape}), + type: () => MapT(keyThunk(), valueThunk(), {shape: options.shape}), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), diff --git a/src/json-member.ts b/src/json-member.ts index dfd0799..fa27dbc 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -1,9 +1,6 @@ import { isReflectMetadataSupported, - isSubtypeOf, - isValueDefined, logError, - logWarning, MISSING_REFLECT_CONF_MSG, nameof, } from './helpers'; @@ -16,19 +13,13 @@ import { SetTypeDescriptor, TypeDescriptor, } from './type-descriptor'; -import {IndexedObject} from './types'; +import {IndexedObject, TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } export interface IJsonMemberOptions extends OptionsBase { - /** - * Sets the constructor of the property. - * Optional with ReflectDecorators. - */ - constructor?: Function | TypeDescriptor | null; - /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean | null; @@ -48,35 +39,40 @@ export interface IJsonMemberOptions extends OptionsBase { serializer?: ((value: any) => any) | null; } -/** - * Specifies that a property is part of the object when serializing, with additional options. - * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always - * explicitly declared. - * @param options Additional options. - */ -export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; - /** * Specifies that a property is part of the object when serializing. - * This call signature requires ReflectDecorators and that the property type is always explicitly - * declared. + * Requires ReflectDecorators. */ export function jsonMember( prototype: IndexedObject, propertyKey: string | symbol, ): void; +/** + * Specifies that a property is part of the object when serializing, with additional options. + * Requires ReflectDecorators. + */ +export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; + +/** + * Specifies that a property is part of the object when serializing, with a defined type and extra + * options. + */ +export function jsonMember( + type: TypeThunk, + options?: IJsonMemberOptions, +): PropertyDecorator; + export function jsonMember( - optionsOrPrototype?: IJsonMemberOptions | IndexedObject, - propKey?: string | symbol, + optionsOrPrototype?: IndexedObject | IJsonMemberOptions | TypeThunk, + propertyKeyOrOptions?: string | symbol | IJsonMemberOptions, ): PropertyDecorator | void { - // @todo, why do we check if propkey is string or symbol? the type only allows symbol/string - // The check is not required. - if (propKey !== undefined - && (typeof propKey === 'string' || typeof propKey as any === 'symbol')) { + if (propertyKeyOrOptions !== undefined + && (typeof propertyKeyOrOptions === 'string' || typeof propertyKeyOrOptions === 'symbol')) { + const property = propertyKeyOrOptions as string; const prototype = optionsOrPrototype as IndexedObject; // For error messages. - const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(propKey)}`; + const decoratorName = `@jsonMember on ${nameof(prototype.constructor)}.${String(property)}`; // jsonMember used directly, no additional information directly available besides target and // propKey. @@ -90,7 +86,7 @@ export function jsonMember( } const reflectPropCtor: Function | null | undefined = - Reflect.getMetadata('design:type', prototype, propKey); + Reflect.getMetadata('design:type', prototype, property); if (reflectPropCtor == null) { logError( @@ -105,79 +101,68 @@ export function jsonMember( return; } - injectMetadataInformation(prototype, propKey, { - type: typeDescriptor, - key: propKey.toString(), - name: propKey.toString(), + injectMetadataInformation(prototype, property, { + type: () => typeDescriptor, + key: propertyKeyOrOptions.toString(), + name: propertyKeyOrOptions.toString(), }); - } else { - // jsonMember used as a decorator factory. - return (target: Object, _propKey: string | symbol) => { - const options: IJsonMemberOptions = optionsOrPrototype as IJsonMemberOptions ?? {}; - let typeDescriptor: TypeDescriptor | undefined; - const decoratorName = - `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; - - if (options.hasOwnProperty('constructor')) { - if (!isValueDefined(options.constructor)) { - logError( - `${decoratorName}: cannot resolve specified property constructor at` - + ' runtime.', - ); - return; - } - - // Property constructor has been specified. Use ReflectDecorators (if available) to - // check whether that constructor is correct. Warn if not. - typeDescriptor = ensureTypeDescriptor(options.constructor); - if (isReflectMetadataSupported && !isSubtypeOf( - typeDescriptor.ctor, - Reflect.getMetadata('design:type', target, _propKey), - )) { - logWarning( - `${decoratorName}: detected property type does not match` - + ` 'constructor' option.`, - ); - } - } else if (isReflectMetadataSupported) { - const reflectCtor = Reflect.getMetadata( - 'design:type', - target, - _propKey, - ) as Function | null | undefined; - - if (reflectCtor == null) { - logError( - `${decoratorName}: cannot resolve detected property constructor at` - + ` runtime.`, - ); - return; - } - typeDescriptor = ensureTypeDescriptor(reflectCtor); - } else if (options.deserializer === undefined) { + return; + } + + // jsonMember used as a decorator factory. + return (target: Object, _propKey: string | symbol) => { + const hasTypeThunk = typeof optionsOrPrototype === 'function'; + const typeThunk = hasTypeThunk ? optionsOrPrototype as TypeThunk : undefined; + const options = (hasTypeThunk + ? propertyKeyOrOptions + : optionsOrPrototype) as IJsonMemberOptions ?? {}; + let typeDescriptor: TypeDescriptor | TypeThunk | undefined; + const decoratorName = + `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; + + if (hasTypeThunk) { + typeDescriptor = typeThunk; + } else if (isReflectMetadataSupported) { + const reflectCtor = Reflect.getMetadata( + 'design:type', + target, + _propKey, + ) as Function | null | undefined; + + if (reflectCtor == null) { logError( - `${decoratorName}: ReflectDecorators is required if no 'constructor' option` - + ` is specified.`, + `${decoratorName}: cannot resolve detected property constructor at` + + ` runtime.`, ); return; } + typeDescriptor = ensureTypeDescriptor(reflectCtor); + } else if (options.deserializer === undefined) { + logError(`${decoratorName}: Cannot determine type`); + return; + } - if (typeDescriptor !== undefined - && isSpecialPropertyType(decoratorName, typeDescriptor)) { - return; - } - injectMetadataInformation(target, _propKey, { - type: typeDescriptor, - emitDefaultValue: options.emitDefaultValue, - isRequired: options.isRequired, - options: extractOptionBase(options), - key: _propKey.toString(), - name: options.name ?? _propKey.toString(), - deserializer: options.deserializer, - serializer: options.serializer, - }); - }; - } + if (typeDescriptor !== undefined + && typeDescriptor instanceof TypeDescriptor + && isSpecialPropertyType(decoratorName, typeDescriptor)) { + return; + } + + injectMetadataInformation(target, _propKey, { + type: typeDescriptor === undefined + ? undefined + : () => typeDescriptor instanceof TypeDescriptor + ? typeDescriptor + : ensureTypeDescriptor(typeDescriptor!()), + emitDefaultValue: options.emitDefaultValue, + isRequired: options.isRequired, + options: extractOptionBase(options), + key: _propKey.toString(), + name: options.name ?? _propKey.toString(), + deserializer: options.deserializer, + serializer: options.serializer, + }); + }; } function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor) { diff --git a/src/json-set-member.ts b/src/json-set-member.ts index df58afd..71ed3af 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -1,7 +1,8 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {isTypelike, SetT} from './type-descriptor'; +import {SetT} from './type-descriptor'; +import {TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -30,20 +31,15 @@ export interface IJsonSetMemberOptions extends OptionsBase { /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. - * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' + * @param typeThunk Constructor of set elements (e.g. 'Number' for Set or 'Date' * for Set). * @param options Additional options. */ -export function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {}) { +export function jsonSetMember(typeThunk: TypeThunk, options: IJsonSetMemberOptions = {}) { return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; - if (!isTypelike(elementConstructor)) { - logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`); - return; - } - // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used // on a set. Warn if not. if (isReflectMetadataSupported @@ -53,7 +49,7 @@ export function jsonSetMember(elementConstructor: Function, options: IJsonSetMem } injectMetadataInformation(target, propKey, { - type: SetT(elementConstructor), + type: () => SetT(typeThunk()), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), diff --git a/src/metadata.ts b/src/metadata.ts index 6777ffc..7855fe0 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -1,7 +1,7 @@ import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers'; import {OptionsBase} from './options-base'; import {TypeDescriptor} from './type-descriptor'; -import {IndexedObject, Serializable} from './types'; +import {IndexedObject, Serializable, TypeThunk} from './types'; export const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; @@ -28,7 +28,7 @@ export interface JsonMemberMetadata { key: string; /** Type descriptor of the member. */ - type?: TypeDescriptor | null; + type?: (() => TypeDescriptor) | null; /** If set, indicates that the member must be present when deserializing. */ isRequired?: boolean | null; @@ -49,6 +49,9 @@ export class JsonObjectMetadata { /** Set of known types used for polymorphic deserialization */ knownTypes = new Set>(); + /** Known types to be evaluated when (de)serialization occurs */ + knownTypesDeferred: Array<() => TypeDescriptor> = []; + /** If present override the global function */ typeHintEmitter?: TypeHintEmitter | null; /** If present override the global function */ @@ -208,11 +211,11 @@ export function injectMetadataInformation( if (metadata.deserializer === undefined) { // If deserializer is not present then type must be - metadata.type!.getTypes().forEach(ctor => objectMetadata.knownTypes.add(ctor)); + objectMetadata.knownTypesDeferred.push(metadata.type!); } // clear metadata of undefined properties to save memory - (Object.keys(metadata) as [keyof JsonMemberMetadata]) + (Object.keys(metadata) as Array) .forEach((key) => (metadata[key] === undefined) && delete metadata[key]); objectMetadata.dataMembers.set(metadata.name, metadata); } diff --git a/src/serializer.ts b/src/serializer.ts index f8a315f..7c67bf4 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -9,6 +9,7 @@ import { import {JsonObjectMetadata, TypeHintEmitter} from './metadata'; import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { + Any, ArrayTypeDescriptor, ConcreteTypeDescriptor, MapShape, @@ -68,6 +69,7 @@ export class Serializer { SerializerFn >([ // primitives + [Any, identity], [Date, identity], [Number, identity], [String, identity], @@ -249,7 +251,7 @@ function convertAsObject( } else { serialized = serializer.convertSingleValue( sourceObject[objMemberMetadata.key], - objMemberMetadata.type, + objMemberMetadata.type(), `${nameof(sourceMeta.classType)}.${objMemberMetadata.key}`, objMemberOptions, ); diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index ac8810d..a569ba4 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -105,6 +105,9 @@ export function MapT( ); } +const anySymbol = Symbol('Any'); +export const Any = () => anySymbol; // It does not actually matter what this function returns + // TODO support for dictionary types ie. maps that are plain objects // export class DictionaryTypeDescriptor extends GenericTypeDescriptor { // constructor(public readonly elementType: TypeDescriptor) { diff --git a/src/types.ts b/src/types.ts index 5913901..993a765 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,9 @@ +import {TypeDescriptor} from './type-descriptor'; + export type IndexedObject = Object & {[key: string]: any}; +export type TypeThunk = () => Serializable | TypeDescriptor; + export interface AbstractType extends Function { prototype: T; } From 2c31ecdae178deb46fddc217e3d07a08369e7429 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 16 Jan 2021 13:07:01 +0000 Subject: [PATCH 076/119] Remove randomness from polymorphism test --- spec/polymorphism-abstract-class.spec.ts | 6 ++- spec/polymorphism-custom-names.spec.ts | 57 ++++++++++-------------- spec/polymorphism-interface.spec.ts | 6 ++- spec/polymorphism-nested-arrays.spec.ts | 6 ++- spec/polymorphism.spec.ts | 57 ++++++++++-------------- 5 files changed, 58 insertions(+), 74 deletions(-) diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 57a85eb..31b8270 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -46,6 +46,8 @@ describe('polymorphic abstract classes', () => { } } + let portTypeIndex = 0; + function randPortType() { const types = [ 'string', @@ -55,7 +57,7 @@ describe('polymorphic abstract classes', () => { 'void', ]; - return types[Math.floor(Math.random() * types.length)]; + return types[portTypeIndex++ % types.length]; } function test(log: boolean) { @@ -64,7 +66,7 @@ describe('polymorphic abstract classes', () => { for (let i = 0; i < 20; i++) { let node: Node; - if (Math.random() < 0.25) { + if (i % 2 === 0) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 52ec9dc..7af65ed 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -75,38 +75,15 @@ describe('polymorphic custom names', () => { } } - function test(log: boolean) { + function test(owner: Person) { // Create a Company. const company = new Company(); company.name = 'Json Types'; - - switch (Math.floor(Math.random() * 4)) { - case 0: - company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); - break; - - case 1: - company.owner = new Investor('John', 'White', 1700000); - break; - - case 2: - company.owner = new PartTimeEmployee( - 'John', - 'White', - 160000, - new Date(1992, 5, 27), - ); - (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); - break; - - default: - company.owner = new Person('John', 'White'); - break; - } + company.owner = owner; // Add employees. for (let j = 0; j < 20; j++) { - if (Math.random() < 0.2) { + if (j % 2 === 0) { const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, @@ -130,18 +107,30 @@ describe('polymorphic custom names', () => { const json = TypedJSON.stringify(company, Company); const reparsed = TypedJSON.parse(json, Company); - if (log) { - console.log('Test: polymorphism with custom names...'); - console.log(company); - console.log(JSON.parse(json)); - console.log(reparsed); - console.log('Test finished.'); + const success = isEqual(company, reparsed); + + if (!success) { + console.log('Polymorphism test failed'); + console.log('company', company); + console.log('json', JSON.parse(json)); + console.log('reparsed', reparsed); } - return isEqual(company, reparsed); + return success; } it('should work', () => { - expect(test(false)).toBeTruthy(); + expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); + expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); + const partTimeEmployee = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + + partTimeEmployee.workHours = 38; + expect(test(partTimeEmployee)).toBeTruthy(); + expect(test(new Person('John', 'White'))).toBeTruthy(); }); }); diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index cc763ea..dc12738 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -57,6 +57,8 @@ describe('polymorphic interfaces', () => { } } + let portTypeIndex = 0; + function randPortType() { const types = [ 'string', @@ -66,7 +68,7 @@ describe('polymorphic interfaces', () => { 'void', ]; - return types[Math.floor(Math.random() * types.length)]; + return types[portTypeIndex++ % types.length]; } function test(log: boolean) { @@ -75,7 +77,7 @@ describe('polymorphic interfaces', () => { for (let i = 0; i < 20; i++) { let point: Point; - if (Math.random() < 0.25) { + if (i % 2 === 0) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index 3ebc255..c3fb6bb 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -45,6 +45,8 @@ describe('polymorphism in nested arrays', () => { } } + let portTypeIndex = 0; + function randPortType() { const types = [ 'string', @@ -54,7 +56,7 @@ describe('polymorphism in nested arrays', () => { 'void', ]; - return types[Math.floor(Math.random() * types.length)]; + return types[portTypeIndex++ % types.length]; } function test(log: boolean) { @@ -80,7 +82,7 @@ describe('polymorphism in nested arrays', () => { for (let j = 0; j < 8; j++) { let node: Node; - if (Math.random() < 0.25) { + if (j % 2 === 0) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 4685c70..987661e 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -77,38 +77,15 @@ describe('polymorphism', () => { } } - function test(log: boolean) { + function test(owner: Person) { // Create a Company. const company = new Company(); company.name = 'Json Types'; - - switch (Math.floor(Math.random() * 4)) { - case 0: - company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); - break; - - case 1: - company.owner = new Investor('John', 'White', 1700000); - break; - - case 2: - company.owner = new PartTimeEmployee( - 'John', - 'White', - 160000, - new Date(1992, 5, 27), - ); - (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); - break; - - default: - company.owner = new Person('John', 'White'); - break; - } + company.owner = owner; // Add employees. for (let j = 0; j < 20; j++) { - if (Math.random() < 0.2) { + if (j % 2 === 0) { const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, @@ -132,18 +109,30 @@ describe('polymorphism', () => { const json = TypedJSON.stringify(company, Company); const reparsed = TypedJSON.parse(json, Company); - if (log) { - console.log('Test: polymorphism...'); - console.log(company); - console.log(JSON.parse(json)); - console.log(reparsed); - console.log('Test finished.'); + const success = isEqual(company, reparsed); + + if (!success) { + console.log('Polymorphism test failed'); + console.log('company', company); + console.log('json', JSON.parse(json)); + console.log('reparsed', reparsed); } - return isEqual(company, reparsed); + return success; } it('should work', () => { - expect(test(false)).toBeTruthy(); + expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); + expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); + const partTimeEmployee = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + + partTimeEmployee.workHours = 38; + expect(test(partTimeEmployee)).toBeTruthy(); + expect(test(new Person('John', 'White'))).toBeTruthy(); }); }); From bf54d1f0bc4d0163fe156cfcfa62208e8ed83f23 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 21 Jan 2021 11:47:55 +0000 Subject: [PATCH 077/119] Test lazy types with different files --- spec/lazy-types/a.model.ts | 16 ++++++++++++++++ spec/lazy-types/b.model.ts | 16 ++++++++++++++++ spec/lazy-types/lazy-types.spec.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 spec/lazy-types/a.model.ts create mode 100644 spec/lazy-types/b.model.ts diff --git a/spec/lazy-types/a.model.ts b/spec/lazy-types/a.model.ts new file mode 100644 index 0000000..73ff553 --- /dev/null +++ b/spec/lazy-types/a.model.ts @@ -0,0 +1,16 @@ +import {jsonMember, jsonObject} from '../../src'; +import {B} from './b.model'; + +@jsonObject +export class A { + + @jsonMember(() => B) + b: B; + + @jsonMember + name: string; + + test(): true { + return true; + } +} diff --git a/spec/lazy-types/b.model.ts b/spec/lazy-types/b.model.ts new file mode 100644 index 0000000..cc421e4 --- /dev/null +++ b/spec/lazy-types/b.model.ts @@ -0,0 +1,16 @@ +import {jsonMember, jsonObject} from '../../src'; +import {A} from './a.model'; + +@jsonObject +export class B { + + @jsonMember(() => A) + a: A; + + @jsonMember + name: string; + + test(): true { + return true; + } +} diff --git a/spec/lazy-types/lazy-types.spec.ts b/spec/lazy-types/lazy-types.spec.ts index f02614f..d026c04 100644 --- a/spec/lazy-types/lazy-types.spec.ts +++ b/spec/lazy-types/lazy-types.spec.ts @@ -6,6 +6,8 @@ import { jsonSetMember, TypedJSON, } from '../../src'; +import {A} from './a.model'; +import {B} from './b.model'; describe('Lazy types', () => { describe('simple member', () => { @@ -165,4 +167,32 @@ describe('Lazy types', () => { expect(result.lazy[0].name).toBe('hello'); }); }); + + it('should work on multi file imports', () => { + const result = TypedJSON.parse({ + b: { + a: { + b: { + name: 'b2', + }, + name: 'a2', + }, + name: 'b1', + }, + name: 'a1', + }, A); + + expect(result).toBeInstanceOf(A); + expect(result.name).toBe('a1'); + expect(result.test()).toBeTrue(); + expect(result.b).toBeInstanceOf(B); + expect(result.b.name).toBe('b1'); + expect(result.b.test()).toBeTrue(); + expect(result.b.a).toBeInstanceOf(A); + expect(result.b.a.name).toBe('a2'); + expect(result.b.a.test()).toBeTrue(); + expect(result.b.a.b).toBeInstanceOf(B); + expect(result.b.a.b.name).toBe('b2'); + expect(result.b.a.b.test()).toBeTrue(); + }); }); From 630ce2cc561a96acb0bbd59e2a110e63307a6e00 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 21 Jan 2021 11:51:44 +0000 Subject: [PATCH 078/119] Test correct decorator usage for lazy types too --- src/json-member.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index fa27dbc..5ab0933 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -142,9 +142,13 @@ export function jsonMember( return; } - if (typeDescriptor !== undefined - && typeDescriptor instanceof TypeDescriptor - && isSpecialPropertyType(decoratorName, typeDescriptor)) { + const typeToTest = typeDescriptor instanceof TypeDescriptor + ? typeDescriptor + : typeDescriptor?.(); + + if (typeToTest !== undefined + && typeToTest instanceof TypeDescriptor + && isSpecialPropertyType(decoratorName, typeToTest)) { return; } From 930b6fbe6faaf76e33a472f6788a9f9e0f556808 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 21 Jan 2021 11:52:44 +0000 Subject: [PATCH 079/119] Use identity for Any type --- src/deserializer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deserializer.ts b/src/deserializer.ts index 682ce21..653eaeb 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -1,4 +1,4 @@ -import {isSubtypeOf, isValueDefined, logError, nameof} from './helpers'; +import {identity, isSubtypeOf, isValueDefined, logError, nameof} from './helpers'; import {JsonObjectMetadata, TypeResolver} from './metadata'; import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { @@ -45,7 +45,7 @@ export class Deserializer { DeserializerFn >([ // primitives - [Any, (sourceObject) => sourceObject], + [Any, identity], [Number, deserializeDirectly], [String, deserializeDirectly], [Boolean, deserializeDirectly], From cc5d830eac3cf8da73c603eddbf19960c8d41e60 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 21 Jan 2021 11:58:25 +0000 Subject: [PATCH 080/119] Replace Any function with TypeDescriptor --- src/type-descriptor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index a569ba4..79711bf 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -105,8 +105,8 @@ export function MapT( ); } -const anySymbol = Symbol('Any'); -export const Any = () => anySymbol; // It does not actually matter what this function returns +export class Any extends TypeDescriptor { +} // TODO support for dictionary types ie. maps that are plain objects // export class DictionaryTypeDescriptor extends GenericTypeDescriptor { From c5d5fe157cf3703c62b5809b68ba66b9907664af Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 22 Jan 2021 22:22:52 +0000 Subject: [PATCH 081/119] Simplify typeDescriptor handling in json-member.ts --- src/json-member.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index 5ab0933..f2e57e2 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -116,7 +116,7 @@ export function jsonMember( const options = (hasTypeThunk ? propertyKeyOrOptions : optionsOrPrototype) as IJsonMemberOptions ?? {}; - let typeDescriptor: TypeDescriptor | TypeThunk | undefined; + let typeDescriptor: TypeThunk | undefined; const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; @@ -136,15 +136,13 @@ export function jsonMember( ); return; } - typeDescriptor = ensureTypeDescriptor(reflectCtor); + typeDescriptor = () => ensureTypeDescriptor(reflectCtor); } else if (options.deserializer === undefined) { logError(`${decoratorName}: Cannot determine type`); return; } - const typeToTest = typeDescriptor instanceof TypeDescriptor - ? typeDescriptor - : typeDescriptor?.(); + const typeToTest = typeDescriptor?.(); if (typeToTest !== undefined && typeToTest instanceof TypeDescriptor @@ -155,9 +153,7 @@ export function jsonMember( injectMetadataInformation(target, _propKey, { type: typeDescriptor === undefined ? undefined - : () => typeDescriptor instanceof TypeDescriptor - ? typeDescriptor - : ensureTypeDescriptor(typeDescriptor!()), + : () => ensureTypeDescriptor(typeDescriptor!()), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), From 2b9c4986abaddd312744982f885cd3a016e1c14f Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 22 Jan 2021 23:32:50 +0000 Subject: [PATCH 082/119] Test for incorrect usage of jsonMember The following case is now successfully found: @jsonMember(() => Array) --- src/json-member.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index f2e57e2..8c47398 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -13,7 +13,7 @@ import { SetTypeDescriptor, TypeDescriptor, } from './type-descriptor'; -import {IndexedObject, TypeThunk} from './types'; +import {Constructor, IndexedObject, TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -144,9 +144,7 @@ export function jsonMember( const typeToTest = typeDescriptor?.(); - if (typeToTest !== undefined - && typeToTest instanceof TypeDescriptor - && isSpecialPropertyType(decoratorName, typeToTest)) { + if (typeToTest !== undefined && isSpecialPropertyType(decoratorName, typeToTest)) { return; } @@ -165,20 +163,25 @@ export function jsonMember( }; } -function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor) { - if (!(typeDescriptor instanceof ArrayTypeDescriptor) && typeDescriptor.ctor === Array) { +function isConstructorEqual(type: TypeDescriptor | Function, constructor: Constructor) { + return type instanceof TypeDescriptor ? type.ctor === constructor : type === constructor; +} + +function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor | Function) { + if (!(typeDescriptor instanceof ArrayTypeDescriptor) + && isConstructorEqual(typeDescriptor, Array)) { logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to` + ` serialize this property.`); return true; } - if (!(typeDescriptor instanceof SetTypeDescriptor) && typeDescriptor.ctor === Set) { + if (!(typeDescriptor instanceof SetTypeDescriptor) && isConstructorEqual(typeDescriptor, Set)) { logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to` + ` serialize this property.`); return true; } - if (!(typeDescriptor instanceof MapTypeDescriptor) && typeDescriptor.ctor === Map) { + if (!(typeDescriptor instanceof MapTypeDescriptor) && isConstructorEqual(typeDescriptor, Map)) { logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to` + ` serialize this property.`); return true; From cb5d476a309a7797fde67ab07def3f8fe32bb13b Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 23 Jan 2021 20:48:54 +0000 Subject: [PATCH 083/119] Rename Any -> AnyT, and assign ConcreteTypeDescriptor --- spec/array.spec.ts | 4 ++-- spec/polymorphism-interface.spec.ts | 4 ++-- spec/set.spec.ts | 4 ++-- src/deserializer.ts | 4 ++-- src/helpers.ts | 4 ++-- src/index.ts | 2 +- src/serializer.ts | 4 ++-- src/type-descriptor.ts | 3 +-- 8 files changed, 14 insertions(+), 15 deletions(-) diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 61609e0..8f9d381 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -1,4 +1,4 @@ -import {Any, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {AnyT, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {Everything, IEverything} from './utils/everything'; describe('array of objects', () => { @@ -170,7 +170,7 @@ describe('multidimensional arrays', () => { describe('array of raw objects', () => { @jsonObject class Translations { - @jsonArrayMember(() => Any) + @jsonArrayMember(() => AnyT) localization: Array; } diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index dc12738..a4c942f 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,4 +1,4 @@ -import {Any, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {AnyT, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic interfaces', () => { @@ -46,7 +46,7 @@ describe('polymorphic interfaces', () => { knownTypes: [BigNode, SmallNode], }) class GraphGrid { - @jsonArrayMember(() => Any) + @jsonArrayMember(() => AnyT) points: Array; @jsonMember diff --git a/spec/set.spec.ts b/spec/set.spec.ts index d3a7e57..e706236 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,4 +1,4 @@ -import {Any, ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; +import {AnyT, ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; import {Everything} from './utils/everything'; describe('set of objects', () => { @@ -202,7 +202,7 @@ describe('set array member', () => { describe('set of raw objects', () => { @jsonObject class WithRawSet { - @jsonSetMember(() => Any) + @jsonSetMember(() => AnyT) rawSet: Set; } diff --git a/src/deserializer.ts b/src/deserializer.ts index 653eaeb..f5dbb5a 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -2,7 +2,7 @@ import {identity, isSubtypeOf, isValueDefined, logError, nameof} from './helpers import {JsonObjectMetadata, TypeResolver} from './metadata'; import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { - Any, + AnyT, ArrayTypeDescriptor, ConcreteTypeDescriptor, MapShape, @@ -45,7 +45,7 @@ export class Deserializer { DeserializerFn >([ // primitives - [Any, identity], + [AnyT.ctor, identity], [Number, deserializeDirectly], [String, deserializeDirectly], [Boolean, deserializeDirectly], diff --git a/src/helpers.ts b/src/helpers.ts index 8b8a8e3..4383989 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,4 +1,4 @@ -import {Any} from './type-descriptor'; +import {AnyT} from './type-descriptor'; import {Serializable} from './types'; declare abstract class Reflect { @@ -109,7 +109,7 @@ export function isValueDefined(value: T): value is Exclude(value: any, constructor: Function): boolean { - if (constructor === Any) { + if (constructor === AnyT.ctor) { return true; } else if (typeof value === 'number') { return constructor === Number; diff --git a/src/index.ts b/src/index.ts index 5f4d825..a4111d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ export {jsonMapMember, IJsonMapMemberOptions} from './json-map-member'; export {toJson, IToJsonOptions} from './to-json'; export { ArrayT, - Any, + AnyT, SetT, MapT, Typelike, diff --git a/src/serializer.ts b/src/serializer.ts index 7c67bf4..1f9df4d 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -9,7 +9,7 @@ import { import {JsonObjectMetadata, TypeHintEmitter} from './metadata'; import {getOptionValue, mergeOptions, OptionsBase} from './options-base'; import { - Any, + AnyT, ArrayTypeDescriptor, ConcreteTypeDescriptor, MapShape, @@ -69,7 +69,7 @@ export class Serializer { SerializerFn >([ // primitives - [Any, identity], + [AnyT.ctor, identity], [Date, identity], [Number, identity], [String, identity], diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 79711bf..47d5d01 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -105,8 +105,7 @@ export function MapT( ); } -export class Any extends TypeDescriptor { -} +export const AnyT = new ConcreteTypeDescriptor(() => undefined); // TODO support for dictionary types ie. maps that are plain objects // export class DictionaryTypeDescriptor extends GenericTypeDescriptor { From fcd09d565cd01e23b1ab6ea5d9c699dab639a105 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 23 Jan 2021 20:53:26 +0000 Subject: [PATCH 084/119] Process knownTypesDeferred in TypedJSON.parse --- src/deserializer.ts | 5 +---- src/metadata.ts | 7 +++++++ src/parser.ts | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/deserializer.ts b/src/deserializer.ts index f5dbb5a..0ca4503 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -254,10 +254,7 @@ function convertAsObject( let typeResolver = deserializer.getTypeResolver(); if (sourceObjectMetadata !== undefined) { - sourceObjectMetadata.knownTypesDeferred.forEach(typeThunk => { - typeThunk().getTypes().forEach(ctor => sourceObjectMetadata!.knownTypes.add(ctor)); - }); - sourceObjectMetadata.knownTypesDeferred = []; + sourceObjectMetadata.processDeferredKnownTypes(); // Merge known types received from "above" with known types defined on the current type. knownTypeConstructors = deserializer.mergeKnownTypes( diff --git a/src/metadata.ts b/src/metadata.ts index 7855fe0..2af2546 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -169,6 +169,13 @@ export class JsonObjectMetadata { return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor) || ctor === DataView || ctor === ArrayBuffer; } + + processDeferredKnownTypes(): void { + this.knownTypesDeferred.forEach(typeThunk => { + typeThunk().getTypes().forEach(ctor => this.knownTypes.add(ctor)); + }); + this.knownTypesDeferred = []; + } } export function injectMetadataInformation( diff --git a/src/parser.ts b/src/parser.ts index 86b1597..010c2cd 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -408,6 +408,7 @@ export class TypedJSON { }); if (rootMetadata !== undefined) { + rootMetadata.processDeferredKnownTypes(); rootMetadata.knownTypes.forEach(knownTypeCtor => { knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); }); From 62a81ccea48dad26c3ccf06e2416271ef408158b Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 26 Jan 2021 14:11:13 +0000 Subject: [PATCH 085/119] Make lazy types backwards compatible --- spec/array.spec.ts | 12 +- spec/base.spec.ts | 4 +- spec/custom-deserializer.spec.ts | 4 +- spec/custom-serializer.spec.ts | 4 +- spec/just-json.spec.ts | 2 +- spec/lazy-types/array.spec.ts | 143 ++++++++ spec/lazy-types/base.spec.ts | 67 ++++ spec/lazy-types/custom-deserializer.spec.ts | 104 ++++++ spec/lazy-types/custom-serializer.spec.ts | 93 ++++++ spec/lazy-types/lazy-types.spec.ts | 2 +- spec/lazy-types/map.spec.ts | 148 ++++++++ spec/lazy-types/mapped-types.spec.ts | 236 +++++++++++++ .../polymorphism-abstract-class.spec.ts | 118 +++++++ .../polymorphism-custom-names.spec.ts | 136 ++++++++ .../polymorphism-custom-type-hints.spec.ts | 316 ++++++++++++++++++ .../lazy-types/polymorphism-interface.spec.ts | 130 +++++++ .../polymorphism-nested-arrays.spec.ts | 135 ++++++++ spec/lazy-types/polymorphism.spec.ts | 138 ++++++++ spec/lazy-types/preserve-null.spec.ts | 49 +++ spec/lazy-types/set.spec.ts | 233 +++++++++++++ spec/lazy-types/to-json.spec.ts | 95 ++++++ spec/map.spec.ts | 4 +- spec/mapped-types.spec.ts | 6 +- spec/polymorphism-abstract-class.spec.ts | 12 +- spec/polymorphism-custom-names.spec.ts | 59 ++-- spec/polymorphism-custom-type-hints.spec.ts | 2 +- spec/polymorphism-interface.spec.ts | 14 +- spec/polymorphism-nested-arrays.spec.ts | 14 +- spec/polymorphism.spec.ts | 59 ++-- spec/preserve-null.spec.ts | 4 +- spec/set.spec.ts | 8 +- src/json-array-member.ts | 10 +- src/json-map-member.ts | 15 +- src/json-member.ts | 48 ++- src/json-set-member.ts | 10 +- src/metadata.ts | 2 +- src/serializer.ts | 1 - src/type-descriptor.ts | 15 + src/types.ts | 1 + 39 files changed, 2335 insertions(+), 118 deletions(-) create mode 100644 spec/lazy-types/array.spec.ts create mode 100644 spec/lazy-types/base.spec.ts create mode 100644 spec/lazy-types/custom-deserializer.spec.ts create mode 100644 spec/lazy-types/custom-serializer.spec.ts create mode 100644 spec/lazy-types/map.spec.ts create mode 100644 spec/lazy-types/mapped-types.spec.ts create mode 100644 spec/lazy-types/polymorphism-abstract-class.spec.ts create mode 100644 spec/lazy-types/polymorphism-custom-names.spec.ts create mode 100644 spec/lazy-types/polymorphism-custom-type-hints.spec.ts create mode 100644 spec/lazy-types/polymorphism-interface.spec.ts create mode 100644 spec/lazy-types/polymorphism-nested-arrays.spec.ts create mode 100644 spec/lazy-types/polymorphism.spec.ts create mode 100644 spec/lazy-types/preserve-null.spec.ts create mode 100644 spec/lazy-types/set.spec.ts create mode 100644 spec/lazy-types/to-json.spec.ts diff --git a/spec/array.spec.ts b/spec/array.spec.ts index 8f9d381..94e7377 100644 --- a/spec/array.spec.ts +++ b/spec/array.spec.ts @@ -1,4 +1,4 @@ -import {AnyT, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {Everything, IEverything} from './utils/everything'; describe('array of objects', () => { @@ -73,16 +73,16 @@ describe('multidimensional arrays', () => { @jsonObject class WithArrays implements IWithArrays { - @jsonArrayMember(() => Everything) + @jsonArrayMember(Everything) one: Array; - @jsonArrayMember(() => Everything, {dimensions: 2}) + @jsonArrayMember(Everything, {dimensions: 2}) two: Array>; - @jsonArrayMember(() => Everything, {dimensions: 6}) + @jsonArrayMember(Everything, {dimensions: 6}) deep: Array>>>>>; - @jsonArrayMember(() => WithArrays, {dimensions: 2}) + @jsonArrayMember(WithArrays, {dimensions: 2}) arrayWithArray?: Array>; constructor(init?: IWithArrays) { @@ -170,7 +170,7 @@ describe('multidimensional arrays', () => { describe('array of raw objects', () => { @jsonObject class Translations { - @jsonArrayMember(() => AnyT) + @jsonArrayMember(Object) localization: Array; } diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 6874d64..6eef90b 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -143,7 +143,7 @@ describe('basic serialization of', () => { @jsonMember bool: boolean = true; - @jsonArrayMember(() => String) + @jsonArrayMember(String) arr: Array = []; @jsonMember @@ -170,7 +170,7 @@ describe('basic serialization of', () => { @jsonMember bool: boolean; - @jsonArrayMember(() => String) + @jsonArrayMember(String) arr: Array; @jsonMember diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index 2cf11be..75b8cc3 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -41,7 +41,7 @@ describe('custom member deserializer', () => { describe('custom array member deserializer', () => { @jsonObject class Obj { - @jsonArrayMember(() => Number, { + @jsonArrayMember(Number, { deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10)), }) nums: Array; @@ -103,7 +103,7 @@ describe('custom delegating array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(() => Inner, {deserializer: objArrayDeserializer}) + @jsonArrayMember(Inner, {deserializer: objArrayDeserializer}) inners: Array; @jsonMember diff --git a/spec/custom-serializer.spec.ts b/spec/custom-serializer.spec.ts index e0eb092..e349e93 100644 --- a/spec/custom-serializer.spec.ts +++ b/spec/custom-serializer.spec.ts @@ -39,7 +39,7 @@ describe('custom member serializer', () => { describe('custom array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(() => Number, {serializer: (values: Array) => values.join(',')}) + @jsonArrayMember(Number, {serializer: (values: Array) => values.join(',')}) nums: Array; @jsonMember @@ -97,7 +97,7 @@ describe('custom delegating array member serializer', () => { @jsonObject class Obj { - @jsonArrayMember(() => Inner, {serializer: objArraySerializer}) + @jsonArrayMember(Inner, {serializer: objArraySerializer}) inners: Array; @jsonMember diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts index a1f77ab..50f4f13 100644 --- a/spec/just-json.spec.ts +++ b/spec/just-json.spec.ts @@ -63,7 +63,7 @@ describe('json (without automatic stringify)', () => { propStr: String; @jsonMember propNum: number; - @jsonArrayMember(() => String) + @jsonArrayMember(String) propArr: Array; @jsonMember propDate: Date; diff --git a/spec/lazy-types/array.spec.ts b/spec/lazy-types/array.spec.ts new file mode 100644 index 0000000..6c8bea5 --- /dev/null +++ b/spec/lazy-types/array.spec.ts @@ -0,0 +1,143 @@ +import {AnyT, jsonArrayMember, jsonObject, TypedJSON} from '../../src'; +import {Everything, IEverything} from '../utils/everything'; + +describe('lazy, multidimensional arrays', () => { + interface IWithArrays { + one: Array; + two: Array>; + deep: Array>>>>>; + arrayWithArray?: Array>; + } + + @jsonObject + class WithArrays implements IWithArrays { + @jsonArrayMember(() => Everything) + one: Array; + + @jsonArrayMember(() => Everything, {dimensions: 2}) + two: Array>; + + @jsonArrayMember(() => Everything, {dimensions: 6}) + deep: Array>>>>>; + + @jsonArrayMember(() => WithArrays, {dimensions: 2}) + arrayWithArray?: Array>; + + constructor(init?: IWithArrays) { + if (init !== undefined) { + Object.assign(this, init); + } + } + } + + function createTestObject(expected: true): WithArrays; + function createTestObject(expected: false): IWithArrays; + function createTestObject(expected: boolean): IWithArrays; + function createTestObject(expected: boolean): IWithArrays { + const nested = { + one: [ + expected ? Everything.expected() : Everything.create(), + expected ? Everything.expected() : Everything.create(), + ], + two: [ + [], + [], + ], + deep: [[[[]]]], + }; + + const result = { + one: [ + expected ? Everything.expected() : Everything.create(), + expected ? Everything.expected() : Everything.create(), + ], + two: [ + [expected ? Everything.expected() : Everything.create()], + [expected ? Everything.expected() : Everything.create()], + [], + [], + ], + deep: [[[[ + [], + [[expected ? Everything.expected() : Everything.create()]], + ]]]], + arrayWithArray: [ + [], + [expected ? new WithArrays(nested) : nested], + ], + }; + + return expected ? new WithArrays(result) : result; + } + + function createTestArray(expected: boolean): Array> { + return [ + [], + [ + createTestObject(expected), + createTestObject(expected), + ], + [], + [ + createTestObject(expected), + ], + ]; + } + + it('deserializes', () => { + const testArray = JSON.stringify(createTestArray(false)); + const result = TypedJSON.parseAsArray(testArray, WithArrays, undefined, 2); + + expect(result).toBeOfLength(4); + expect(result[0]).toBeOfLength(0); + expect(result[1]).toBeOfLength(2); + expect(result[1][0]).toEqual(createTestObject(true)); + expect(result[1][1]).toEqual(createTestObject(true)); + expect(result[2]).toBeOfLength(0); + expect(result[3]).toBeOfLength(1); + expect(result[3][0]).toEqual(createTestObject(true)); + }); + + it('serializes', () => { + const result = TypedJSON.stringifyAsArray(createTestArray(true), WithArrays, 2); + + expect(result).toBe(JSON.stringify(createTestArray(false))); + }); +}); + +describe('lazy, array of raw objects', () => { + @jsonObject + class Translations { + @jsonArrayMember(() => AnyT) + localization: Array; + } + + function localization() { + return [ + { + language_tag: 'en_us', + '/actions/main': 'My Game Actions', + '/actions/driving': 'Driving', + }, + { + language_tag: 'fr', + '/actions/main': 'Mes actions de jeux', + '/actions/driving': 'Conduire', + }, + ]; + } + + it('should deserialize as is', () => { + const translations = TypedJSON.parse({localization: localization()}, Translations); + expect(translations).toBeDefined(); + expect(translations instanceof Translations).toBeTruthy(); + expect(translations.localization).toEqual(localization()); + }); + + it('should serialize as is', () => { + const translations = new Translations(); + translations.localization = localization(); + const json = TypedJSON.toPlainJson(translations, Translations); + expect(json).toEqual({localization: localization()}); + }); +}); diff --git a/spec/lazy-types/base.spec.ts b/spec/lazy-types/base.spec.ts new file mode 100644 index 0000000..3cc4393 --- /dev/null +++ b/spec/lazy-types/base.spec.ts @@ -0,0 +1,67 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; + +describe('lazy, basic serialization of', () => { + describe('class with defaults', () => { + describe('by assigment', () => { + @jsonObject + class WithDefaults { + @jsonMember + num: number = 2; + + @jsonMember + str: string = 'Hello world'; + + @jsonMember + bool: boolean = true; + + @jsonArrayMember(() => String) + arr: Array = []; + + @jsonMember + present: number = 10; + } + + it('should use defaults when missing', () => { + const deserialized = TypedJSON.parse('{"present":5}', WithDefaults); + const expected = new WithDefaults(); + expected.present = 5; + expect(deserialized).toEqual(expected); + }); + }); + + describe('by constructor', () => { + @jsonObject + class WithCtr { + @jsonMember + num: number; + + @jsonMember + str: string; + + @jsonMember + bool: boolean; + + @jsonArrayMember(() => String) + arr: Array; + + @jsonMember + present: number; + + constructor() { + this.num = 2; + this.str = 'Hello world'; + this.bool = true; + this.arr = []; + this.present = 10; + } + } + + it('should use defaults when missing', () => { + const deserialized = TypedJSON.parse('{"present":5}', WithCtr); + const expected = new WithCtr(); + expected.present = 5; + expect(deserialized).toEqual(expected); + }); + }); + }); +}); diff --git a/spec/lazy-types/custom-deserializer.spec.ts b/spec/lazy-types/custom-deserializer.spec.ts new file mode 100644 index 0000000..a9310ba --- /dev/null +++ b/spec/lazy-types/custom-deserializer.spec.ts @@ -0,0 +1,104 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; + +describe('lazy, custom array member deserializer', () => { + @jsonObject + class Obj { + @jsonArrayMember(() => Number, { + deserializer: (json: any) => json.split(',').map((v) => parseInt(v, 10)), + }) + nums: Array; + + @jsonMember + str: string; + + sum() { + return this.nums.reduce((sum, cur) => sum + cur, 0); + } + } + + beforeAll(function () { + this.obj = TypedJSON.parse('{ "nums": "1,2,3,4,5", "str": "Some string" }', Obj); + }); + + it('should properly deserialize', function () { + expect(this.obj.nums).toEqual([1, 2, 3, 4, 5]); + expect(this.obj.str).toBe('Some string'); + }); + + it('should obj object of proper type', function () { + expect(this.obj instanceof Obj).toBeTruthy(); + }); + + it('should return object with callable functions', function () { + expect(this.obj.sum).toBeDefined(); + expect(this.obj.sum()).toBe(15); + }); + + it('should not affect serialization', function () { + expect(TypedJSON.stringify(this.obj, Obj)).toBe('{"nums":[1,2,3,4,5],"str":"Some string"}'); + }); +}); + +describe('lazy, custom delegating array member serializer', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + woo(): string { + return 'hoo'; + } + } + + function objArrayDeserializer( + values: Array<{prop: string; shouldDeserialize: boolean}> | undefined, + ) { + if (values === undefined) { + return; + } + + return TypedJSON.parseAsArray( + values.filter(value => value.shouldDeserialize), + Inner, + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(() => Inner, {deserializer: objArrayDeserializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = TypedJSON.parse( + JSON.stringify({ + inners: [ + { + prop: 'something', + shouldDeserialize: false, + }, + { + prop: 'gogo', + shouldDeserialize: true, + }, + ], + str: 'Text', + }), + Obj, + ); + }); + + it('should properly serialize', function () { + expect(this.obj).toBeDefined(); + expect(this.obj instanceof Obj).toBeTruthy(); + expect(this.obj.str).toEqual('Text'); + expect(this.obj.inners.length).toEqual(1); + expect(this.obj.inners[0] instanceof Inner).toBeTruthy(); + expect(this.obj.inners[0]).not.toHaveProperties(['shouldDeserialize']); + expect(this.obj.inners[0]).toHaveProperties({prop: 'gogo'}); + expect(this.obj.inners[0].woo()).toEqual('hoo'); + }); +}); diff --git a/spec/lazy-types/custom-serializer.spec.ts b/spec/lazy-types/custom-serializer.spec.ts new file mode 100644 index 0000000..0b79a79 --- /dev/null +++ b/spec/lazy-types/custom-serializer.spec.ts @@ -0,0 +1,93 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; + +describe('lazy, custom array member serializer', () => { + @jsonObject + class Obj { + @jsonArrayMember(() => Number, {serializer: (values: Array) => values.join(',')}) + nums: Array; + + @jsonMember + str: string; + + sum() { + return this.nums.reduce((sum, cur) => sum + cur, 0); + } + } + + beforeAll(function () { + this.obj = new Obj(); + this.obj.nums = [3, 45, 34]; + this.obj.str = 'Text'; + this.json = JSON.parse(TypedJSON.stringify(this.obj, Obj)); + }); + + it('should properly serialize', function () { + expect(this.json).toEqual( + { + nums: '3,45,34', + str: 'Text', + }, + ); + }); + + it('should not affect deserialization', () => { + expect(TypedJSON.parse('{"nums":[4,5,6,7],"str":"string"}', Obj)) + .toEqual(Object.assign(new Obj(), {nums: [4, 5, 6, 7], str: 'string'} as Obj)); + }); +}); + +describe('lazy, custom delegating array member serializer', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + shouldSerialize: boolean; + + constructor(); + constructor(prop: string, shouldSerialize: boolean); + constructor(prop?: string, shouldSerialize?: boolean) { + this.prop = prop; + this.shouldSerialize = shouldSerialize; + } + } + + function objArraySerializer(values: Array) { + return TypedJSON.toPlainArray( + values.filter(value => value.shouldSerialize), + Inner, + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(() => Inner, {serializer: objArraySerializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = new Obj(); + this.obj.inners = [ + new Inner('valval', false), + new Inner('something', true), + ]; + this.obj.str = 'Text'; + this.json = JSON.parse(TypedJSON.stringify(this.obj, Obj)); + }); + + it('should properly serialize', function () { + expect(this.json).toEqual( + { + inners: [ + { + prop: 'something', + }, + ], + str: 'Text', + }, + ); + }); +}); diff --git a/spec/lazy-types/lazy-types.spec.ts b/spec/lazy-types/lazy-types.spec.ts index d026c04..d99baf8 100644 --- a/spec/lazy-types/lazy-types.spec.ts +++ b/spec/lazy-types/lazy-types.spec.ts @@ -9,7 +9,7 @@ import { import {A} from './a.model'; import {B} from './b.model'; -describe('Lazy types', () => { +describe('lazy, Lazy types', () => { describe('simple member', () => { @jsonObject class Root { diff --git a/spec/lazy-types/map.spec.ts b/spec/lazy-types/map.spec.ts new file mode 100644 index 0000000..2d7fade --- /dev/null +++ b/spec/lazy-types/map.spec.ts @@ -0,0 +1,148 @@ +import {ArrayT, jsonMapMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {MapShape} from '../../src/type-descriptor'; + +describe('lazy, map dictionary shape', () => { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init?: {strProp: string; numProp: number}) { + if (init !== undefined) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class DictMap { + @jsonMapMember(() => String, () => Simple, {shape: MapShape.OBJECT}) + prop: Map; + + getSetSize() { + return this.prop.size; + } + } + + it('deserializes', () => { + const result = TypedJSON.parse( + JSON.stringify( + { + prop: { + one: {strProp: 'delta', numProp: 4}, + two: {strProp: 'gamma', numProp: 7}, + }, + }, + ), + DictMap, + ); + + expect(result).toBeInstanceOf(DictMap); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Map); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(result.prop.get('one').strProp).toBe('delta'); + expect(result.prop.get('two').strProp).toBe('gamma'); + }); + + it('serializes', () => { + const object = new DictMap(); + object.prop = new Map([ + ['one', new Simple({strProp: 'delta', numProp: 4})], + ['two', new Simple({strProp: 'gamma', numProp: 7})], + ]); + const result = TypedJSON.stringify(object, DictMap); + + expect(result).toBe(JSON.stringify({ + prop: { + one: {strProp: 'delta', numProp: 4}, + two: {strProp: 'gamma', numProp: 7}, + }, + })); + }); +}); + +describe('lazy, map of array dictionary shape', () => { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init?: {strProp: string; numProp: number}) { + if (init !== undefined) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class DictArrayMap { + @jsonMapMember(() => String, () => ArrayT(Simple), {shape: MapShape.OBJECT}) + prop: Map>; + + getSetSize() { + return this.prop.size; + } + } + + it('deserializes', () => { + const result = TypedJSON.parse( + JSON.stringify( + { + prop: { + one: [{strProp: 'delta', numProp: 4}], + two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], + }, + }, + ), + DictArrayMap, + ); + + expect(result).toBeInstanceOf(DictArrayMap); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Map); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(result.prop.get('one').length).toBe(1); + expect(result.prop.get('one')[0].foo()).toBe('delta-4'); + expect(result.prop.get('two').length).toBe(2); + expect(result.prop.get('two')[0].foo()).toBe('gamma-7'); + expect(result.prop.get('two')[1].foo()).toBe('alpha-2'); + }); + + it('serializes', () => { + const object = new DictArrayMap(); + object.prop = new Map>([ + ['one', [new Simple({strProp: 'delta', numProp: 4})]], + ['two', [ + new Simple({strProp: 'gamma', numProp: 7}), + new Simple({strProp: 'alpha', numProp: 2}), + ]], + ]); + const result = TypedJSON.stringify(object, DictArrayMap); + + expect(result).toBe(JSON.stringify({ + prop: { + one: [{strProp: 'delta', numProp: 4}], + two: [{strProp: 'gamma', numProp: 7}, {strProp: 'alpha', numProp: 2}], + }, + })); + }); +}); diff --git a/spec/lazy-types/mapped-types.spec.ts b/spec/lazy-types/mapped-types.spec.ts new file mode 100644 index 0000000..8e2c88d --- /dev/null +++ b/spec/lazy-types/mapped-types.spec.ts @@ -0,0 +1,236 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; + +TypedJSON.setGlobalConfig({ + errorHandler: e => { + throw e; + }, +}); + +const date2000 = '2000-01-01T00:00:00.000Z'; +const date3000 = '3000-01-01T00:00:00.000Z'; + +describe('lazy, mapped types', () => { + class CustomType { + value: any; + + constructor(value: any) { + this.value = value; + } + + hasSucceeded(): boolean { + return this.value != null; + } + } + + @jsonObject + class MappedTypesSpec { + + @jsonMember + one: CustomType; + + @jsonMember + two: CustomType; + } + + const testData = { + one: 1, + two: 2, + }; + + describe('instance', () => { + const typedJson = new TypedJSON(MappedTypesSpec); + typedJson.mapType(CustomType, { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }); + + it('deserializes', () => { + const result = typedJson.parse(testData); + + expect(result.one).toBeInstanceOf(CustomType); + expect(result.one.hasSucceeded()).toBeTrue(); + expect(result.two).toBeInstanceOf(CustomType); + expect(result.two.hasSucceeded()).toBeTrue(); + }); + + it('serializes', () => { + const test = new MappedTypesSpec(); + test.one = new CustomType(1); + test.two = new CustomType(2); + const result = typedJson.toPlainJson(test); + + expect(result).toEqual(testData); + }); + }); + + describe('works with constructor,', () => { + @jsonObject + class MappedTypeWithConstructor { + + @jsonMember(() => CustomType) + nullable: any; + } + + const typedJson = new TypedJSON(MappedTypeWithConstructor); + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + typedJson.mapType(CustomType, CustomTypeMap); + + it('deserializes', () => { + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + const result = typedJson.parse({nullable: 5}); + expect(result.nullable?.hasSucceeded()).toBeTrue(); + expect(result.nullable?.value).toBe(5); + expect(CustomTypeMap.deserializer).toHaveBeenCalled(); + }); + + it('serializes', () => { + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + const object = new MappedTypeWithConstructor(); + object.nullable = new CustomType(5); + const result = typedJson.toPlainJson(object); + expect(CustomTypeMap.serializer).toHaveBeenCalled(); + expect(result).toEqual({nullable: 5}); + }); + }); + + it('can be overwritten with deserializer/serializer prop', () => { + const jsonMemberOptions = { + deserializer: json => new CustomType(0), + serializer: value => 1, + }; + + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + spyOn(jsonMemberOptions, 'serializer').and.callThrough(); + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + spyOn(jsonMemberOptions, 'deserializer').and.callThrough(); + + @jsonObject + class OverriddenSerializer { + @jsonMember(jsonMemberOptions) + overwritten: CustomType; + + @jsonMember + simple: CustomType; + } + + const typedJson = new TypedJSON(OverriddenSerializer); + typedJson.mapType(CustomType, CustomTypeMap); + + const parsed = typedJson.parse({data: 5, simple: 5}); + expect(CustomTypeMap.deserializer).toHaveBeenCalledTimes(1); + expect(jsonMemberOptions.deserializer).toHaveBeenCalledTimes(1); + expect(parsed.overwritten.value).toBe(0); + expect(parsed.simple.value).toBe(5); + + const plain: any = typedJson.toPlainJson(parsed); + expect(CustomTypeMap.serializer).toHaveBeenCalledTimes(1); + expect(jsonMemberOptions.serializer).toHaveBeenCalledTimes(1); + expect(plain.overwritten).toBe(1); + expect(plain.simple).toBe(5); + }); + + it('should use default when only mapping deserializer', () => { + @jsonObject + class OnlyDeSerializer { + @jsonMember + date: Date; + } + + const typedJson = new TypedJSON(OnlyDeSerializer); + typedJson.mapType(Date, { + deserializer: value => new Date(new Date(value).setFullYear(3000)), + }); + + const parsed = typedJson.parse({date: date2000}); + + expect(parsed.date.toISOString()).toEqual(date3000); + expect((typedJson.toPlainJson(parsed) as any).date.toString()) + .toEqual(new Date(date3000).toString()); + }); + + it('should use default when only mapping serializer', () => { + @jsonObject + class OnlySerializer { + @jsonMember + date: Date; + } + + const typedJson = new TypedJSON(OnlySerializer); + typedJson.mapType(Date, { + serializer: value => new Date(value.setFullYear(3000)).toISOString(), + }); + + const test = new OnlySerializer(); + test.date = new Date(date2000); + const result = typedJson.toPlainJson(test); + + expect(result).toEqual({date: date3000}); + expect(typedJson.parse({date: date2000}).date.toISOString()).toEqual(date2000); + }); + + it('should handle mapping arrays', () => { + @jsonObject + class MappedTypeWithArray { + + @jsonArrayMember(() => String) + array: Array; + } + + const typedJson = new TypedJSON(MappedTypeWithArray); + const ArrayTypeMap = { + deserializer: json => ['deserialized'], + serializer: value => ['serialized'], + }; + + typedJson.mapType(Array, ArrayTypeMap); + + spyOn(ArrayTypeMap, 'serializer').and.callThrough(); + spyOn(ArrayTypeMap, 'deserializer').and.callThrough(); + const parsed = typedJson.parse({array: ['hello']}); + expect(ArrayTypeMap.deserializer).toHaveBeenCalled(); + expect(parsed.array).toEqual(['deserialized']); + + const plain: any = typedJson.toPlainJson(parsed); + expect(ArrayTypeMap.serializer).toHaveBeenCalled(); + expect(plain.array).toEqual(['serialized']); + }); + + it('works on arrays', () => { + @jsonObject + class MappedTypeWithArray { + + @jsonArrayMember(() => CustomType) + array: Array; + } + + const typedJson = new TypedJSON(MappedTypeWithArray); + const CustomTypeMap = { + deserializer: json => new CustomType(json), + serializer: value => value.value, + }; + typedJson.mapType(CustomType, CustomTypeMap); + + spyOn(CustomTypeMap, 'serializer').and.callThrough(); + spyOn(CustomTypeMap, 'deserializer').and.callThrough(); + const parsed = typedJson.parse({array: [1, 5]}); + expect(CustomTypeMap.deserializer).toHaveBeenCalled(); + expect(parsed.array.map(c => c.value)).toEqual([1, 5]); + + const plain: any = typedJson.toPlainJson(parsed); + expect(CustomTypeMap.serializer).toHaveBeenCalled(); + expect(plain.array).toEqual([1, 5]); + }); +}); + +TypedJSON.setGlobalConfig({ + errorHandler: () => undefined, +}); + diff --git a/spec/lazy-types/polymorphism-abstract-class.spec.ts b/spec/lazy-types/polymorphism-abstract-class.spec.ts new file mode 100644 index 0000000..f9de480 --- /dev/null +++ b/spec/lazy-types/polymorphism-abstract-class.spec.ts @@ -0,0 +1,118 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {isEqual} from '../utils/object-compare'; + +describe('lazy, polymorphic abstract classes', () => { + abstract class Node { + @jsonMember + name: string; + } + + @jsonObject + class SmallNode extends Node { + @jsonMember + inputType: string; + + @jsonMember + outputType: string; + } + + @jsonObject + class BigNode extends Node { + @jsonArrayMember(() => String) + inputs: Array; + + @jsonArrayMember(() => String) + outputs: Array; + + constructor() { + super(); + this.inputs = []; + this.outputs = []; + } + } + + @jsonObject({ + knownTypes: [BigNode, SmallNode], + }) + class Graph { + @jsonArrayMember(() => Node) + nodes: Array; + + @jsonMember + root: Node; + + constructor() { + this.nodes = []; + } + } + + let portTypeIndex = 0; + + function randPortType() { + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', + ]; + + return types[portTypeIndex++ % types.length]; + } + + function test(log: boolean) { + const graph = new Graph(); + + for (let i = 0; i < 20; i++) { + let node: Node; + + if (i % 2 === 0) { + const bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType(), + ]; + bigNode.outputs = [ + randPortType(), + randPortType(), + ]; + + node = bigNode; + } else { + const smallNode = new SmallNode(); + + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + node = smallNode; + } + + node.name = `node_${i}`; + + if (i === 0) { + graph.root = node; + } else { + graph.nodes.push(node); + } + } + + const json = TypedJSON.stringify(graph, Graph); + const clone = TypedJSON.parse(json, Graph); + + if (log) { + console.log('Test: polymorphism with abstract property types...'); + console.log(graph); + console.log(JSON.parse(json)); + console.log(clone); + console.log('Test finished.'); + } + + return isEqual(graph, clone); + } + + it('should work', () => { + expect(test(false)).toBeTruthy(); + }); +}); diff --git a/spec/lazy-types/polymorphism-custom-names.spec.ts b/spec/lazy-types/polymorphism-custom-names.spec.ts new file mode 100644 index 0000000..b981e97 --- /dev/null +++ b/spec/lazy-types/polymorphism-custom-names.spec.ts @@ -0,0 +1,136 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {isEqual} from '../utils/object-compare'; + +describe('lazy, polymorphic custom names', () => { + @jsonObject + class Person { + @jsonMember({name: 'first-name'}) + firstName: string; + + @jsonMember({name: 'last-name'}) + lastName: string; + + constructor(firstName?: string, lastName?: string) { + if (firstName !== undefined && lastName !== undefined) { + this.firstName = firstName; + this.lastName = lastName; + } + } + } + + @jsonObject + class Employee extends Person { + @jsonMember + salary: number; + + @jsonMember + joined: Date; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, salary: number, joined: Date); + constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { + super(firstName, lastName); + + if (salary !== undefined && joined !== undefined) { + this.salary = salary; + this.joined = joined; + } + } + } + + @jsonObject({name: 'part-time-employee'}) + class PartTimeEmployee extends Employee { + @jsonMember({name: 'work-hours'}) + workHours: number; + } + + @jsonObject() + class Investor extends Person { + @jsonMember({name: 'invest-amount'}) + investAmount: number; + + constructor(); + constructor(firstName: string, lastName: string, investAmount?: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); + + this.investAmount = investAmount ?? 0; + } + } + + @jsonObject({name: 'company', knownTypes: [PartTimeEmployee, Investor]}) + class Company { + @jsonMember + name: string; + + @jsonArrayMember(() => Employee, {name: 'company-employees'}) + employees: Array; + + @jsonMember + owner: Person; + + constructor() { + this.employees = []; + } + } + + function test(owner: Person) { + // Create a Company. + const company = new Company(); + company.name = 'Json Types'; + company.owner = owner; + + // Add employees. + for (let j = 0; j < 20; j++) { + if (j % 2 === 0) { + const newPartTimeEmployee = new PartTimeEmployee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)), + ); + + newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); + + company.employees.push(newPartTimeEmployee); + } else { + company.employees.push(new Employee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)), + )); + } + } + + const json = TypedJSON.stringify(company, Company); + const reparsed = TypedJSON.parse(json, Company); + + const success = isEqual(company, reparsed); + + if (!success) { + console.log('Polymorphism test failed'); + console.log('company', company); + console.log('json', JSON.parse(json)); + console.log('reparsed', reparsed); + } + + return success; + } + + it('should work', () => { + expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); + expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); + const partTimeEmployee = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + + partTimeEmployee.workHours = 38; + expect(test(partTimeEmployee)).toBeTruthy(); + expect(test(new Person('John', 'White'))).toBeTruthy(); + }); +}); diff --git a/spec/lazy-types/polymorphism-custom-type-hints.spec.ts b/spec/lazy-types/polymorphism-custom-type-hints.spec.ts new file mode 100644 index 0000000..4dee868 --- /dev/null +++ b/spec/lazy-types/polymorphism-custom-type-hints.spec.ts @@ -0,0 +1,316 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {IndexedObject} from '../../src/types'; + +describe('lazy, polymorphism custom type hints', () => { + describe('should work for a base class', () => { + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => { + targetObject.personType = `${sourceObject.constructor.name}Type`; + }, + typeResolver: sourceObject => TYPE_MAP[sourceObject.personType], + }) + abstract class Person { + @jsonMember + firstName: string; + + @jsonMember + lastName: string; + + constructor(firstName?: string, lastName?: string); + constructor(firstName: string, lastName: string); + constructor(firstName?: string, lastName?: string) { + if (firstName !== undefined && lastName !== undefined) { + this.firstName = firstName; + this.lastName = lastName; + } + } + } + + @jsonObject + class Employee extends Person { + @jsonMember + salary: number; + + constructor(); + constructor(firstName: string, lastName: string, salary?: number); + constructor(firstName?: string, lastName?: string, salary?: number) { + super(firstName, lastName); + + if (salary !== undefined) { + this.salary = salary; + } + } + } + + @jsonObject + class PartTimeEmployee extends Employee { + @jsonMember + workHours: number; + } + + @jsonObject + class Investor extends Person { + @jsonMember + investAmount: number; + + constructor(); + constructor(firstName: string, lastName: string, investAmount?: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); + + this.investAmount = investAmount ?? 0; + } + } + + const TYPE_MAP: IndexedObject = { + EmployeeType: Employee, + PartTimeEmployeeType: PartTimeEmployee, + InvestorType: Investor, + }; + + @jsonObject + class Company { + @jsonMember + name: string; + + @jsonArrayMember(() => Employee) + employees: Array = []; + + @jsonMember + owner: Person; + } + + it('should emit custom hint', () => { + const company = new Company(); + company.name = 'Json Types'; + company.owner = new Investor('John', 'White', 1700000); + + const partTime = new PartTimeEmployee('Abe', 'White', 160000); + partTime.workHours = 20; + company.employees = [ + new Employee('Donn', 'Worker', 240000), + partTime, + new Employee('Smith', 'Elly', 35500), + ]; + + const json = TypedJSON.toPlainJson(company, Company); + expect(json).toEqual({ + name: 'Json Types', + owner: { + personType: 'InvestorType', + firstName: 'John', + lastName: 'White', + investAmount: 1700000, + }, + employees: [ + { + personType: 'EmployeeType', + firstName: 'Donn', + lastName: 'Worker', + salary: 240000, + }, + { + personType: 'PartTimeEmployeeType', + firstName: 'Abe', + lastName: 'White', + salary: 160000, + workHours: 20, + }, + { + personType: 'EmployeeType', + firstName: 'Smith', + lastName: 'Elly', + salary: 35500, + }, + ], + }); + }); + + it('should resolve custom hints', () => { + const json = { + name: 'Json Types', + owner: { + personType: 'InvestorType', + firstName: 'John', + lastName: 'White', + investAmount: 1700000, + }, + employees: [ + { + personType: 'EmployeeType', + firstName: 'Donn', + lastName: 'Worker', + salary: 240000, + }, + { + personType: 'PartTimeEmployeeType', + firstName: 'Abe', + lastName: 'White', + salary: 160000, + workHours: 20, + }, + { + personType: 'EmployeeType', + firstName: 'Smith', + lastName: 'Elly', + salary: 35500, + }, + ], + }; + + const deserialized = TypedJSON.parse(JSON.stringify(json), Company); + + const company = new Company(); + company.name = 'Json Types'; + company.owner = new Investor('John', 'White', 1700000); + + const partTime = new PartTimeEmployee('Abe', 'White', 160000); + partTime.workHours = 20; + company.employees = [ + new Employee('Donn', 'Worker', 240000), + partTime, + new Employee('Smith', 'Elly', 35500), + ]; + expect(deserialized).toEqual(company); + }); + }); + + describe('should override parents', () => { + abstract class StructuralBase { + @jsonMember + value: string; + } + + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => { + targetObject.type = (sourceObject.constructor as any).type; + }, + typeResolver: sourceObject => { + return sourceObject.type === 'sub-one' ? ConcreteOne : AnotherConcreteOne; + }, + }) + abstract class SemanticBaseOne extends StructuralBase { + @jsonMember + prop1: number; + } + + @jsonObject + class ConcreteOne extends SemanticBaseOne { + static type = 'sub-one'; + @jsonMember + propSub: string; + } + + @jsonObject + class AnotherConcreteOne extends SemanticBaseOne { + static type = 'sub-two'; + @jsonMember + propSub: number; + } + + @jsonObject({ + typeHintEmitter: (targetObject, sourceObject) => { + targetObject.hint = sourceObject instanceof ConcreteTwo ? 'first' : 'another'; + }, + typeResolver: sourceObject => { + return sourceObject.hint === 'first' ? ConcreteTwo : AnotherConcreteTwo; + }, + }) + abstract class SemanticBaseTwo extends StructuralBase { + @jsonMember + prop2: number; + } + + @jsonObject + class ConcreteTwo extends SemanticBaseTwo { + @jsonMember + propSub: string; + } + + @jsonObject + class AnotherConcreteTwo extends SemanticBaseTwo { + @jsonMember + propSub: number; + } + + it('should work for SemanticBaseOne', () => { + const inputAndResult: Array<[() => SemanticBaseOne, () => IndexedObject]> = [ + [ + () => { + const expected = new ConcreteOne(); + expected.value = 'base'; + expected.prop1 = 10; + expected.propSub = 'something'; + return expected; + }, + () => ({ + type: 'sub-one', + value: 'base', + prop1: 10, + propSub: 'something', + }), + ], + [ + () => { + const expected = new AnotherConcreteOne(); + expected.value = 'base value'; + expected.prop1 = 245; + expected.propSub = 234; + return expected; + }, + () => ({ + type: 'sub-two', + value: 'base value', + prop1: 245, + propSub: 234, + }), + ], + ]; + + inputAndResult.forEach(([inputFn, serializedFn]) => { + expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseOne)).toEqual(serializedFn()); + expect(TypedJSON.parse(serializedFn(), SemanticBaseOne)).toEqual(inputFn()); + }); + }); + + it('should work for SemanticBaseTwo', () => { + const inputAndResult: Array<[() => SemanticBaseTwo, () => IndexedObject]> = [ + [ + () => { + const expected = new ConcreteTwo(); + expected.value = 'base'; + expected.prop2 = 546; + expected.propSub = 'something'; + return expected; + }, + () => ({ + hint: 'first', + value: 'base', + prop2: 546, + propSub: 'something', + }), + ], + [ + () => { + const expected = new AnotherConcreteTwo(); + expected.value = 'base value'; + expected.prop2 = 74; + expected.propSub = 234; + return expected; + }, + () => ({ + hint: 'another', + value: 'base value', + prop2: 74, + propSub: 234, + }), + ], + ]; + + inputAndResult.forEach(([inputFn, serializedFn]) => { + expect(TypedJSON.toPlainJson(inputFn(), SemanticBaseTwo)).toEqual(serializedFn()); + expect(TypedJSON.parse(serializedFn(), SemanticBaseTwo)).toEqual(inputFn()); + }); + }); + }); +}); diff --git a/spec/lazy-types/polymorphism-interface.spec.ts b/spec/lazy-types/polymorphism-interface.spec.ts new file mode 100644 index 0000000..95e0d85 --- /dev/null +++ b/spec/lazy-types/polymorphism-interface.spec.ts @@ -0,0 +1,130 @@ +import {AnyT, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {isEqual} from '../utils/object-compare'; + +describe('lazy, polymorphic interfaces', () => { + interface Point { + x: number; + y: number; + } + + @jsonObject + class SmallNode implements Point { + @jsonMember + x: number; + + @jsonMember + y: number; + + @jsonMember + inputType: string; + + @jsonMember + outputType: string; + } + + @jsonObject + class BigNode implements Point { + @jsonMember + x: number; + + @jsonMember + y: number; + + @jsonArrayMember(() => String) + inputs: Array; + + @jsonArrayMember(() => String) + outputs: Array; + + constructor() { + this.inputs = []; + this.outputs = []; + } + } + + @jsonObject({ + knownTypes: [BigNode, SmallNode], + }) + class GraphGrid { + @jsonArrayMember(() => AnyT) + points: Array; + + @jsonMember + root: Point; + + constructor() { + this.points = []; + } + } + + let portTypeIndex = 0; + + function randPortType() { + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', + ]; + + return types[portTypeIndex++ % types.length]; + } + + function test(log: boolean) { + const graph = new GraphGrid(); + + for (let i = 0; i < 20; i++) { + let point: Point; + + if (i % 2 === 0) { + const bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType(), + ]; + bigNode.outputs = [ + randPortType(), + randPortType(), + ]; + + point = bigNode; + } else { + const smallNode = new SmallNode(); + + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + point = smallNode; + } + + point.x = Math.random(); + point.y = Math.random(); + + if (i === 0) { + graph.root = point; + } else { + graph.points.push(point); + } + } + + const json = TypedJSON.stringify(graph, GraphGrid); + const clone = TypedJSON.parse(json, GraphGrid); + + if (log) { + console.log('Test: polymorphism with interface property types...'); + console.log(graph); + console.log(JSON.parse(json)); + console.log(clone); + console.log('Test finished.'); + } + + return isEqual(graph, clone); + } + + it('should work', () => { + expect(test(false)).toBeTruthy(); + }); +}); diff --git a/spec/lazy-types/polymorphism-nested-arrays.spec.ts b/spec/lazy-types/polymorphism-nested-arrays.spec.ts new file mode 100644 index 0000000..83ea183 --- /dev/null +++ b/spec/lazy-types/polymorphism-nested-arrays.spec.ts @@ -0,0 +1,135 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {isEqual} from '../utils/object-compare'; + +describe('lazy, polymorphism in nested arrays', () => { + abstract class Node { + @jsonMember + name: string; + } + + @jsonObject + class SmallNode extends Node { + @jsonMember + inputType: string; + + @jsonMember + outputType: string; + } + + @jsonObject + class BigNode extends Node { + @jsonArrayMember(() => String) + inputs: Array; + + @jsonArrayMember(() => String) + outputs: Array; + + constructor() { + super(); + this.inputs = []; + this.outputs = []; + } + } + + @jsonObject({knownTypes: [BigNode, SmallNode]}) + class Graph { + @jsonArrayMember(() => Node, {dimensions: 2}) + items: Array>; + + @jsonArrayMember(() => SmallNode, {dimensions: 2}) + smallItems: Array>; + + constructor() { + this.items = []; + this.smallItems = []; + } + } + + let portTypeIndex = 0; + + function randPortType() { + const types = [ + 'string', + 'integer', + 'float', + 'boolean', + 'void', + ]; + + return types[portTypeIndex++ % types.length]; + } + + function test(log: boolean) { + const graph = new Graph(); + + for (let i = 0; i < 20; i++) { + graph.smallItems.push([]); + + for (let j = 0; j < 8; j++) { + const node = new SmallNode(); + + node.name = `smallnode_${i}_${j}`; + node.inputType = randPortType(); + node.outputType = randPortType(); + + graph.smallItems[i].push(node); + } + } + + for (let i = 0; i < 20; i++) { + graph.items.push([]); + + for (let j = 0; j < 8; j++) { + let node: Node; + + if (j % 2 === 0) { + const bigNode = new BigNode(); + + bigNode.inputs = [ + randPortType(), + randPortType(), + randPortType(), + ]; + bigNode.outputs = [ + randPortType(), + randPortType(), + ]; + + node = bigNode; + } else { + const smallNode = new SmallNode(); + + smallNode.inputType = randPortType(); + smallNode.outputType = randPortType(); + + node = smallNode; + } + + node.name = `node_${i}_${j}`; + + graph.items[i].push(node); + } + } + + const json = TypedJSON.stringify(graph, Graph); + + if (log) { + console.log('Test: polymorphism with nested arrays...'); + console.log(graph); + console.log(JSON.parse(json)); + } + + const clone = TypedJSON.parse(json, Graph); + + if (log) { + console.log(clone); + console.log('Test finished.'); + } + + return isEqual(graph, clone); + } + + it('should work', () => { + expect(test(false)).toBeTruthy(); + }); +}); diff --git a/spec/lazy-types/polymorphism.spec.ts b/spec/lazy-types/polymorphism.spec.ts new file mode 100644 index 0000000..46c62a9 --- /dev/null +++ b/spec/lazy-types/polymorphism.spec.ts @@ -0,0 +1,138 @@ +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {isEqual} from '../utils/object-compare'; + +describe('lazy, polymorphism', () => { + @jsonObject + class Person { + @jsonMember + firstName: string; + + @jsonMember + lastName: string; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName?: string, lastName?: string) { + if (firstName !== undefined && lastName !== undefined) { + this.firstName = firstName; + this.lastName = lastName; + } + } + } + + @jsonObject + class Employee extends Person { + @jsonMember + salary: number; + + @jsonMember + joined: Date; + + constructor(); + constructor(firstName: string, lastName: string); + constructor(firstName: string, lastName: string, salary: number, joined: Date); + constructor(firstName?: string, lastName?: string, salary?: number, joined?: Date) { + super(firstName, lastName); + + if (salary !== undefined && joined !== undefined) { + this.salary = salary; + this.joined = joined; + } + } + } + + @jsonObject + class PartTimeEmployee extends Employee { + @jsonMember + workHours: number; + } + + @jsonObject + class Investor extends Person { + @jsonMember + investAmount: number; + + constructor(); + constructor(firstName: string, lastName: string, investAmount?: number); + constructor(firstName?: string, lastName?: string, investAmount?: number) { + super(firstName, lastName); + + this.investAmount = investAmount ?? 0; + } + } + + @jsonObject({knownTypes: [PartTimeEmployee, Investor]}) + class Company { + @jsonMember + name: string; + + @jsonArrayMember(() => Employee) + employees: Array; + + @jsonMember + owner: Person; + + constructor() { + this.employees = []; + } + } + + function test(owner: Person) { + // Create a Company. + const company = new Company(); + company.name = 'Json Types'; + company.owner = owner; + + // Add employees. + for (let j = 0; j < 20; j++) { + if (j % 2 === 0) { + const newPartTimeEmployee = new PartTimeEmployee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)), + ); + + newPartTimeEmployee.workHours = Math.floor(Math.random() * 40); + + company.employees.push(newPartTimeEmployee); + } else { + company.employees.push(new Employee( + `firstname_${j}`, + `lastname_${j}`, + Math.floor(Math.random() * 80000), + new Date(Date.now() - Math.floor(Math.random() * 80000)), + )); + } + } + + const json = TypedJSON.stringify(company, Company); + const reparsed = TypedJSON.parse(json, Company); + + const success = isEqual(company, reparsed); + + if (!success) { + console.log('Polymorphism test failed'); + console.log('company', company); + console.log('json', JSON.parse(json)); + console.log('reparsed', reparsed); + } + + return success; + } + + it('should work', () => { + expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); + expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); + const partTimeEmployee = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + + partTimeEmployee.workHours = 38; + expect(test(partTimeEmployee)).toBeTruthy(); + expect(test(new Person('John', 'White'))).toBeTruthy(); + }); +}); diff --git a/spec/lazy-types/preserve-null.spec.ts b/spec/lazy-types/preserve-null.spec.ts new file mode 100644 index 0000000..7ada0e6 --- /dev/null +++ b/spec/lazy-types/preserve-null.spec.ts @@ -0,0 +1,49 @@ +import {jsonArrayMember, jsonMapMember, jsonObject, TypedJSON} from '../../src'; + +describe('lazy, preserveNull', () => { + it('should preserve nulls in array', () => { + @jsonObject + class Person { + @jsonArrayMember(() => String, {preserveNull: true}) + names: Array; + } + + const input = new Person(); + input.names = [null, 'one', null, null, 'two', null]; + const json = TypedJSON.stringify(input, Person); + expect(json).toEqual('{"names":[null,"one",null,null,"two",null]}'); + const obj = TypedJSON.parse({names: [null, 'one', null, null, 'two', null]}, Person); + expect(obj).toEqual(input); + }); + + it('should preserve nulls in maps', () => { + @jsonObject + class Person { + @jsonMapMember(() => String, () => String, {preserveNull: true}) + map: Map; + } + + const input = new Person(); + input.map = new Map([ + ['one', null], + ['two', null], + ['three', 'val'], + ]); + const json = TypedJSON.stringify(input, Person); + expect(json).toEqual( + '{"map":[{"key":"one","value":null},{"key":"two","value":null},' + + '{"key":"three","value":"val"}]}', + ); + const obj = TypedJSON.parse( + { + map: [ + {key: 'one', value: null}, + {key: 'two', value: null}, + {key: 'three', value: 'val'}, + ], + }, + Person, + ); + expect(obj).toEqual(input); + }); +}); diff --git a/spec/lazy-types/set.spec.ts b/spec/lazy-types/set.spec.ts new file mode 100644 index 0000000..913c376 --- /dev/null +++ b/spec/lazy-types/set.spec.ts @@ -0,0 +1,233 @@ +import {AnyT, ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../../src'; +import {Everything} from '../utils/everything'; + +describe('lazy, set of objects', () => { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init?: {strProp: string; numProp: number}) { + if (init !== undefined) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + it('deserializes empty set', () => { + const result = TypedJSON.parseAsSet('[]', Simple); + expect(result).toBeDefined(); + expect(result.size).toBe(0); + }); + + it('serialized empty set', () => { + const result = TypedJSON.stringifyAsSet(new Set(), Simple); + expect(result).toBe('[]'); + }); + + it('deserialized should be of proper type', () => { + const expectation = [ + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, + ]; + + const result = TypedJSON.parseAsSet(JSON.stringify(expectation), Simple); + + expect(result.size).toBe(3, 'Deserialized set is of wrong size'); + result.forEach((obj) => { + expect(obj).toBeInstanceOf(Simple); + expect(obj) + .toHaveProperties(expectation.find((expected) => expected.strProp === obj.strProp)); + }); + }); + + it('serialized should contain all elements', () => { + const expectation = [ + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, + ]; + + const set = new Set(expectation.map(obj => new Simple(obj))); + const result = TypedJSON.stringifyAsSet(set, Simple); + + expect(result).toBe(JSON.stringify(expectation)); + }); +}); + +describe('lazy, set member', () => { + @jsonObject + class WithSet { + @jsonSetMember(() => Everything) + prop: Set; + + getSetSize() { + return this.prop.size; + } + } + + it('deserializes', () => { + const object = {prop: [Everything.create(), Everything.create()]}; + const result = TypedJSON.parse(JSON.stringify(object), WithSet); + + expect(result).toBeInstanceOf(WithSet); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Set); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(Array.from(result.prop)).toEqual([Everything.expected(), Everything.expected()]); + }); + + it('serializes', () => { + const object = new WithSet(); + object.prop = new Set([Everything.expected(), Everything.expected()]); + const result = TypedJSON.stringify(object, WithSet); + + expect(result).toBe(JSON.stringify({prop: [Everything.create(), Everything.create()]})); + }); +}); + +describe('lazy, set array member', () => { + @jsonObject + class Simple { + @jsonMember + strProp: string; + + @jsonMember + numProp: number; + + constructor(init?: {strProp: string; numProp: number}) { + if (init !== undefined) { + this.strProp = init.strProp; + this.numProp = init.numProp; + } + } + + foo() { + return `${this.strProp}-${this.numProp}`; + } + } + + @jsonObject + class WithSet { + @jsonMember(() => SetT(ArrayT(Simple))) + prop: Set>; + + getSetSize() { + return this.prop.size; + } + } + + it('deserializes', () => { + const result = TypedJSON.parse( + JSON.stringify( + { + prop: [ + [ + {strProp: 'delta', numProp: 4}, + {strProp: 'bravo', numProp: 2}, + {strProp: 'gamma', numProp: 0}, + ], + [ + {strProp: 'alpha', numProp: 3245}, + {strProp: 'zeta', numProp: 4358}, + ], + ], + }, + ), + WithSet, + ); + + expect(result).toBeInstanceOf(WithSet); + expect(result.prop).toBeDefined(); + expect(result.prop).toBeInstanceOf(Set); + expect(result.prop.size).toBe(2); + expect(result.getSetSize()).toBe(2); + expect(Array.from(result.prop)).toEqual([ + [ + new Simple({strProp: 'delta', numProp: 4}), + new Simple({strProp: 'bravo', numProp: 2}), + new Simple({strProp: 'gamma', numProp: 0}), + ], + [ + new Simple({strProp: 'alpha', numProp: 3245}), + new Simple({strProp: 'zeta', numProp: 4358}), + ], + ]); + }); + + it('serializes', () => { + const object = new WithSet(); + object.prop = new Set>([ + [new Simple({strProp: 'delta', numProp: 4})], + [ + new Simple({strProp: 'alpha', numProp: 3245}), + new Simple({strProp: 'zeta', numProp: 4358}), + ], + ]); + const result = TypedJSON.stringify(object, WithSet); + + expect(result).toBe(JSON.stringify({ + prop: [ + [ + { + strProp: 'delta', + numProp: 4, + }, + ], + [ + { + strProp: 'alpha', + numProp: 3245, + }, + { + strProp: 'zeta', + numProp: 4358, + }, + ], + ], + })); + }); +}); + +describe('lazy, set of raw objects', () => { + @jsonObject + class WithRawSet { + @jsonSetMember(() => AnyT) + rawSet: Set; + } + + function rawObjects() { + return [ + { + prop: 'something', + }, + { + another: 'value', + }, + ]; + } + + it('should deserialize as is', () => { + const withRawSet = TypedJSON.parse({rawSet: rawObjects()}, WithRawSet); + expect(withRawSet).toBeDefined(); + expect(withRawSet instanceof WithRawSet).toBeTruthy(); + expect(withRawSet.rawSet).toEqual(new Set(rawObjects())); + }); + + it('should serialize as is', () => { + const withRawSet = new WithRawSet(); + withRawSet.rawSet = new Set(rawObjects()); + const json = TypedJSON.toPlainJson(withRawSet, WithRawSet); + expect(json).toEqual({rawSet: rawObjects()}); + }); +}); diff --git a/spec/lazy-types/to-json.spec.ts b/spec/lazy-types/to-json.spec.ts new file mode 100644 index 0000000..f0beb7c --- /dev/null +++ b/spec/lazy-types/to-json.spec.ts @@ -0,0 +1,95 @@ +import {jsonMember, jsonObject, toJson} from '../../src'; + +describe('lazy, toJson decorator', () => { + it('should work with JSON.stringify', () => { + @toJson + @jsonObject + class Person { + firstName?: string; + + @jsonMember({name: 'surname'}) + lastName?: string; + + getFullName() { + return `${this.firstName} ${this.lastName}`; + } + } + + const person = new Person(); + person.firstName = 'John'; + person.lastName = 'Doe'; + expect(JSON.stringify(person)).toBe('{"surname":"Doe"}'); + }); + + it('should work on the abstract class', () => { + @toJson + abstract class Base { + @jsonMember({name: 'renamed'}) + prop?: string; + } + + @jsonObject + class Sub extends Base { + @jsonMember({name: 'numeric'}) + num?: number; + } + + @jsonObject + class OtherSub extends Base { + @jsonMember + decimal?: number; + ignored?: string; + } + + const sub = new Sub(); + sub.prop = 'value'; + sub.num = 20; + expect(JSON.stringify(sub)).toBe('{"renamed":"value","numeric":20}'); + + const otherSub = new OtherSub(); + otherSub.prop = 'value'; + otherSub.decimal = 123; + otherSub.ignored = 'assigned'; + expect(JSON.stringify(otherSub)).toBe('{"renamed":"value","decimal":123}'); + }); + + it('should throw an error when toJSON already exists', () => { + try { + @toJson + @jsonObject + class Some { + @jsonMember + prop?: string; + + toJSON() { + return {}; + } + } + + const some = new Some(); + some.prop = 'value'; + expect(JSON.stringify(some)).toBe('{}'); + + fail('Should not succeed'); + } catch (error) { + // ok + } + }); + + it('should overwrite toJSON when overwrite is true', () => { + @toJson({overwrite: true}) + @jsonObject + class Some { + @jsonMember + prop?: string; + + toJSON() { + return {}; + } + } + + const some = new Some(); + some.prop = 'value'; + expect(JSON.stringify(some)).toBe('{"prop":"value"}'); + }); +}); diff --git a/spec/map.spec.ts b/spec/map.spec.ts index 7e38972..3e22643 100644 --- a/spec/map.spec.ts +++ b/spec/map.spec.ts @@ -27,7 +27,7 @@ describe('map dictionary shape', () => { @jsonObject class DictMap { - @jsonMapMember(() => String, () => Simple, {shape: MapShape.OBJECT}) + @jsonMapMember(String, Simple, {shape: MapShape.OBJECT}) prop: Map; getSetSize() { @@ -97,7 +97,7 @@ describe('map of array dictionary shape', () => { @jsonObject class DictArrayMap { - @jsonMapMember(() => String, () => ArrayT(Simple), {shape: MapShape.OBJECT}) + @jsonMapMember(String, ArrayT(Simple), {shape: MapShape.OBJECT}) prop: Map>; getSetSize() { diff --git a/spec/mapped-types.spec.ts b/spec/mapped-types.spec.ts index 1e62b84..131e981 100644 --- a/spec/mapped-types.spec.ts +++ b/spec/mapped-types.spec.ts @@ -92,7 +92,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithConstructor { - @jsonMember(() => CustomType) + @jsonMember(CustomType) nullable: any; } @@ -205,7 +205,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithArray { - @jsonArrayMember(() => String) + @jsonArrayMember(String) array: Array; } @@ -232,7 +232,7 @@ describe('mapped types', () => { @jsonObject class MappedTypeWithArray { - @jsonArrayMember(() => CustomType) + @jsonArrayMember(CustomType) array: Array; } diff --git a/spec/polymorphism-abstract-class.spec.ts b/spec/polymorphism-abstract-class.spec.ts index 31b8270..23d5ffb 100644 --- a/spec/polymorphism-abstract-class.spec.ts +++ b/spec/polymorphism-abstract-class.spec.ts @@ -18,10 +18,10 @@ describe('polymorphic abstract classes', () => { @jsonObject class BigNode extends Node { - @jsonArrayMember(() => String) + @jsonArrayMember(String) inputs: Array; - @jsonArrayMember(() => String) + @jsonArrayMember(String) outputs: Array; constructor() { @@ -35,7 +35,7 @@ describe('polymorphic abstract classes', () => { knownTypes: [BigNode, SmallNode], }) class Graph { - @jsonArrayMember(() => Node) + @jsonArrayMember(Node) nodes: Array; @jsonMember @@ -46,8 +46,6 @@ describe('polymorphic abstract classes', () => { } } - let portTypeIndex = 0; - function randPortType() { const types = [ 'string', @@ -57,7 +55,7 @@ describe('polymorphic abstract classes', () => { 'void', ]; - return types[portTypeIndex++ % types.length]; + return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { @@ -66,7 +64,7 @@ describe('polymorphic abstract classes', () => { for (let i = 0; i < 20; i++) { let node: Node; - if (i % 2 === 0) { + if (Math.random() < 0.25) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism-custom-names.spec.ts b/spec/polymorphism-custom-names.spec.ts index 7af65ed..7399494 100644 --- a/spec/polymorphism-custom-names.spec.ts +++ b/spec/polymorphism-custom-names.spec.ts @@ -64,7 +64,7 @@ describe('polymorphic custom names', () => { @jsonMember name: string; - @jsonArrayMember(() => Employee, {name: 'company-employees'}) + @jsonArrayMember(Employee, {name: 'company-employees'}) employees: Array; @jsonMember @@ -75,15 +75,38 @@ describe('polymorphic custom names', () => { } } - function test(owner: Person) { + function test(log: boolean) { // Create a Company. const company = new Company(); company.name = 'Json Types'; - company.owner = owner; + + switch (Math.floor(Math.random() * 4)) { + case 0: + company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); + break; + + case 1: + company.owner = new Investor('John', 'White', 1700000); + break; + + case 2: + company.owner = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); + break; + + default: + company.owner = new Person('John', 'White'); + break; + } // Add employees. for (let j = 0; j < 20; j++) { - if (j % 2 === 0) { + if (Math.random() < 0.2) { const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, @@ -107,30 +130,18 @@ describe('polymorphic custom names', () => { const json = TypedJSON.stringify(company, Company); const reparsed = TypedJSON.parse(json, Company); - const success = isEqual(company, reparsed); - - if (!success) { - console.log('Polymorphism test failed'); - console.log('company', company); - console.log('json', JSON.parse(json)); - console.log('reparsed', reparsed); + if (log) { + console.log('Test: polymorphism with custom names...'); + console.log(company); + console.log(JSON.parse(json)); + console.log(reparsed); + console.log('Test finished.'); } - return success; + return isEqual(company, reparsed); } it('should work', () => { - expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); - expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); - const partTimeEmployee = new PartTimeEmployee( - 'John', - 'White', - 160000, - new Date(1992, 5, 27), - ); - - partTimeEmployee.workHours = 38; - expect(test(partTimeEmployee)).toBeTruthy(); - expect(test(new Person('John', 'White'))).toBeTruthy(); + expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/polymorphism-custom-type-hints.spec.ts b/spec/polymorphism-custom-type-hints.spec.ts index fc9557b..0d2c27c 100644 --- a/spec/polymorphism-custom-type-hints.spec.ts +++ b/spec/polymorphism-custom-type-hints.spec.ts @@ -73,7 +73,7 @@ describe('polymorphism custom type hints', () => { @jsonMember name: string; - @jsonArrayMember(() => Employee) + @jsonArrayMember(Employee) employees: Array = []; @jsonMember diff --git a/spec/polymorphism-interface.spec.ts b/spec/polymorphism-interface.spec.ts index a4c942f..4ea400e 100644 --- a/spec/polymorphism-interface.spec.ts +++ b/spec/polymorphism-interface.spec.ts @@ -1,4 +1,4 @@ -import {AnyT, jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; import {isEqual} from './utils/object-compare'; describe('polymorphic interfaces', () => { @@ -30,10 +30,10 @@ describe('polymorphic interfaces', () => { @jsonMember y: number; - @jsonArrayMember(() => String) + @jsonArrayMember(String) inputs: Array; - @jsonArrayMember(() => String) + @jsonArrayMember(String) outputs: Array; constructor() { @@ -46,7 +46,7 @@ describe('polymorphic interfaces', () => { knownTypes: [BigNode, SmallNode], }) class GraphGrid { - @jsonArrayMember(() => AnyT) + @jsonArrayMember(Object) points: Array; @jsonMember @@ -57,8 +57,6 @@ describe('polymorphic interfaces', () => { } } - let portTypeIndex = 0; - function randPortType() { const types = [ 'string', @@ -68,7 +66,7 @@ describe('polymorphic interfaces', () => { 'void', ]; - return types[portTypeIndex++ % types.length]; + return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { @@ -77,7 +75,7 @@ describe('polymorphic interfaces', () => { for (let i = 0; i < 20; i++) { let point: Point; - if (i % 2 === 0) { + if (Math.random() < 0.25) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism-nested-arrays.spec.ts b/spec/polymorphism-nested-arrays.spec.ts index c3fb6bb..71c7168 100644 --- a/spec/polymorphism-nested-arrays.spec.ts +++ b/spec/polymorphism-nested-arrays.spec.ts @@ -18,10 +18,10 @@ describe('polymorphism in nested arrays', () => { @jsonObject class BigNode extends Node { - @jsonArrayMember(() => String) + @jsonArrayMember(String) inputs: Array; - @jsonArrayMember(() => String) + @jsonArrayMember(String) outputs: Array; constructor() { @@ -33,10 +33,10 @@ describe('polymorphism in nested arrays', () => { @jsonObject({knownTypes: [BigNode, SmallNode]}) class Graph { - @jsonArrayMember(() => Node, {dimensions: 2}) + @jsonArrayMember(Node, {dimensions: 2}) items: Array>; - @jsonArrayMember(() => SmallNode, {dimensions: 2}) + @jsonArrayMember(SmallNode, {dimensions: 2}) smallItems: Array>; constructor() { @@ -45,8 +45,6 @@ describe('polymorphism in nested arrays', () => { } } - let portTypeIndex = 0; - function randPortType() { const types = [ 'string', @@ -56,7 +54,7 @@ describe('polymorphism in nested arrays', () => { 'void', ]; - return types[portTypeIndex++ % types.length]; + return types[Math.floor(Math.random() * types.length)]; } function test(log: boolean) { @@ -82,7 +80,7 @@ describe('polymorphism in nested arrays', () => { for (let j = 0; j < 8; j++) { let node: Node; - if (j % 2 === 0) { + if (Math.random() < 0.25) { const bigNode = new BigNode(); bigNode.inputs = [ diff --git a/spec/polymorphism.spec.ts b/spec/polymorphism.spec.ts index 987661e..6a0fd6e 100644 --- a/spec/polymorphism.spec.ts +++ b/spec/polymorphism.spec.ts @@ -66,7 +66,7 @@ describe('polymorphism', () => { @jsonMember name: string; - @jsonArrayMember(() => Employee) + @jsonArrayMember(Employee) employees: Array; @jsonMember @@ -77,15 +77,38 @@ describe('polymorphism', () => { } } - function test(owner: Person) { + function test(log: boolean) { // Create a Company. const company = new Company(); company.name = 'Json Types'; - company.owner = owner; + + switch (Math.floor(Math.random() * 4)) { + case 0: + company.owner = new Employee('John', 'White', 240000, new Date(1992, 5, 27)); + break; + + case 1: + company.owner = new Investor('John', 'White', 1700000); + break; + + case 2: + company.owner = new PartTimeEmployee( + 'John', + 'White', + 160000, + new Date(1992, 5, 27), + ); + (company.owner as PartTimeEmployee).workHours = Math.floor(Math.random() * 40); + break; + + default: + company.owner = new Person('John', 'White'); + break; + } // Add employees. for (let j = 0; j < 20; j++) { - if (j % 2 === 0) { + if (Math.random() < 0.2) { const newPartTimeEmployee = new PartTimeEmployee( `firstname_${j}`, `lastname_${j}`, @@ -109,30 +132,18 @@ describe('polymorphism', () => { const json = TypedJSON.stringify(company, Company); const reparsed = TypedJSON.parse(json, Company); - const success = isEqual(company, reparsed); - - if (!success) { - console.log('Polymorphism test failed'); - console.log('company', company); - console.log('json', JSON.parse(json)); - console.log('reparsed', reparsed); + if (log) { + console.log('Test: polymorphism...'); + console.log(company); + console.log(JSON.parse(json)); + console.log(reparsed); + console.log('Test finished.'); } - return success; + return isEqual(company, reparsed); } it('should work', () => { - expect(test(new Employee('John', 'White', 240000, new Date(1992, 5, 27)))).toBeTruthy(); - expect(test(new Investor('John', 'White', 1700000))).toBeTruthy(); - const partTimeEmployee = new PartTimeEmployee( - 'John', - 'White', - 160000, - new Date(1992, 5, 27), - ); - - partTimeEmployee.workHours = 38; - expect(test(partTimeEmployee)).toBeTruthy(); - expect(test(new Person('John', 'White'))).toBeTruthy(); + expect(test(false)).toBeTruthy(); }); }); diff --git a/spec/preserve-null.spec.ts b/spec/preserve-null.spec.ts index 8a872d6..c7e3fea 100644 --- a/spec/preserve-null.spec.ts +++ b/spec/preserve-null.spec.ts @@ -156,7 +156,7 @@ describe('preserveNull', () => { it('should preserve nulls in array', () => { @jsonObject class Person { - @jsonArrayMember(() => String, {preserveNull: true}) + @jsonArrayMember(String, {preserveNull: true}) names: Array; } @@ -171,7 +171,7 @@ describe('preserveNull', () => { it('should preserve nulls in maps', () => { @jsonObject class Person { - @jsonMapMember(() => String, () => String, {preserveNull: true}) + @jsonMapMember(String, String, {preserveNull: true}) map: Map; } diff --git a/spec/set.spec.ts b/spec/set.spec.ts index e706236..39b8056 100644 --- a/spec/set.spec.ts +++ b/spec/set.spec.ts @@ -1,4 +1,4 @@ -import {AnyT, ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; +import {ArrayT, jsonMember, jsonObject, jsonSetMember, SetT, TypedJSON} from '../src'; import {Everything} from './utils/everything'; describe('set of objects', () => { @@ -67,7 +67,7 @@ describe('set of objects', () => { describe('set member', () => { @jsonObject class WithSet { - @jsonSetMember(() => Everything) + @jsonSetMember(Everything) prop: Set; getSetSize() { @@ -119,7 +119,7 @@ describe('set array member', () => { @jsonObject class WithSet { - @jsonMember(() => SetT(ArrayT(Simple))) + @jsonMember({constructor: SetT(ArrayT(Simple))}) prop: Set>; getSetSize() { @@ -202,7 +202,7 @@ describe('set array member', () => { describe('set of raw objects', () => { @jsonObject class WithRawSet { - @jsonSetMember(() => AnyT) + @jsonSetMember(Object) rawSet: Set; } diff --git a/src/json-array-member.ts b/src/json-array-member.ts index 7da2956..b8a379a 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -4,10 +4,10 @@ import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ensureTypeDescriptor, - isTypelike, + ensureTypeThunk, TypeDescriptor, } from './type-descriptor'; -import {TypeThunk} from './types'; +import {MaybeTypeThunk, TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -38,14 +38,16 @@ export interface IJsonArrayMemberOptions extends OptionsBase { /** * Specifies that a property, of type array, is part of an object when serializing. - * @param typeThunk Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' + * @param maybeTypeThunk Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' * for 'Date[]'). * @param options Additional options. */ export function jsonArrayMember( - typeThunk: TypeThunk, + maybeTypeThunk: MaybeTypeThunk, options: IJsonArrayMemberOptions = {}, ) { + const typeThunk: TypeThunk = ensureTypeThunk(maybeTypeThunk); + return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 600b937..5a385ca 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -1,8 +1,8 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {MapOptions, MapT} from './type-descriptor'; -import {TypeThunk} from './types'; +import {ensureTypeThunk, MapOptions, MapT} from './type-descriptor'; +import {MaybeTypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -31,15 +31,18 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Map. - * @param keyThunk Constructor of map keys (e.g. 'Number' for 'Map'). - * @param valueThunk Constructor of map values (e.g. 'Date' for 'Map'). + * @param maybeKeyThunk Constructor of map keys (e.g. 'Number' for 'Map'). + * @param maybeValueThunk Constructor of map values (e.g. 'Date' for 'Map'). * @param options Additional options. */ export function jsonMapMember( - keyThunk: TypeThunk, - valueThunk: TypeThunk, + maybeKeyThunk: MaybeTypeThunk, + maybeValueThunk: MaybeTypeThunk, options: IJsonMapMemberOptions = {}, ) { + const keyThunk = ensureTypeThunk(maybeKeyThunk); + const valueThunk = ensureTypeThunk(maybeValueThunk); + return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; diff --git a/src/json-member.ts b/src/json-member.ts index 8c47398..578fb97 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -1,6 +1,9 @@ import { isReflectMetadataSupported, + isSubtypeOf, + isValueDefined, logError, + logWarning, MISSING_REFLECT_CONF_MSG, nameof, } from './helpers'; @@ -9,17 +12,24 @@ import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, ensureTypeDescriptor, + ensureTypeThunk, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, } from './type-descriptor'; -import {Constructor, IndexedObject, TypeThunk} from './types'; +import {Constructor, IndexedObject, MaybeTypeThunk, TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } export interface IJsonMemberOptions extends OptionsBase { + /** + * Sets the constructor of the property. + * Optional with ReflectDecorators. + */ + constructor?: Function | TypeDescriptor | null; + /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean | null; @@ -59,12 +69,12 @@ export function jsonMember(options: IJsonMemberOptions): PropertyDecorator; * options. */ export function jsonMember( - type: TypeThunk, + type: MaybeTypeThunk, options?: IJsonMemberOptions, ): PropertyDecorator; export function jsonMember( - optionsOrPrototype?: IndexedObject | IJsonMemberOptions | TypeThunk, + optionsOrPrototype?: IndexedObject | IJsonMemberOptions | MaybeTypeThunk, propertyKeyOrOptions?: string | symbol | IJsonMemberOptions, ): PropertyDecorator | void { if (propertyKeyOrOptions !== undefined @@ -112,7 +122,9 @@ export function jsonMember( // jsonMember used as a decorator factory. return (target: Object, _propKey: string | symbol) => { const hasTypeThunk = typeof optionsOrPrototype === 'function'; - const typeThunk = hasTypeThunk ? optionsOrPrototype as TypeThunk : undefined; + const typeThunk = hasTypeThunk + ? ensureTypeThunk(optionsOrPrototype as any) + : undefined; const options = (hasTypeThunk ? propertyKeyOrOptions : optionsOrPrototype) as IJsonMemberOptions ?? {}; @@ -120,7 +132,33 @@ export function jsonMember( const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; - if (hasTypeThunk) { + if (options.hasOwnProperty('constructor')) { + if (hasTypeThunk) { + throw new Error('Cannot both define constructor and type. Only one allowed.'); + } + + if (!isValueDefined(options.constructor)) { + logError( + `${decoratorName}: cannot resolve specified property constructor at` + + ' runtime.', + ); + return; + } + + // Property constructor has been specified. Use ReflectDecorators (if available) to + // check whether that constructor is correct. Warn if not. + const newTypeDescriptor = ensureTypeDescriptor(options.constructor); + typeDescriptor = () => newTypeDescriptor; + if (isReflectMetadataSupported && !isSubtypeOf( + newTypeDescriptor.ctor, + Reflect.getMetadata('design:type', target, _propKey), + )) { + logWarning( + `${decoratorName}: detected property type does not match` + + ` 'constructor' option.`, + ); + } + } else if (hasTypeThunk) { typeDescriptor = typeThunk; } else if (isReflectMetadataSupported) { const reflectCtor = Reflect.getMetadata( diff --git a/src/json-set-member.ts b/src/json-set-member.ts index 71ed3af..b0c56e8 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -1,8 +1,8 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {SetT} from './type-descriptor'; -import {TypeThunk} from './types'; +import {ensureTypeThunk, SetT} from './type-descriptor'; +import {MaybeTypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; @@ -31,11 +31,13 @@ export interface IJsonSetMemberOptions extends OptionsBase { /** * Specifies that the property is part of the object when serializing. * Use this decorator on properties of type Set. - * @param typeThunk Constructor of set elements (e.g. 'Number' for Set or 'Date' + * @param maybeTypeThunk Constructor of set elements (e.g. 'Number' for Set or 'Date' * for Set). * @param options Additional options. */ -export function jsonSetMember(typeThunk: TypeThunk, options: IJsonSetMemberOptions = {}) { +export function jsonSetMember(maybeTypeThunk: MaybeTypeThunk, options: IJsonSetMemberOptions = {}) { + const typeThunk = ensureTypeThunk(maybeTypeThunk); + return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; diff --git a/src/metadata.ts b/src/metadata.ts index 2af2546..c9f1108 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -1,7 +1,7 @@ import {isDirectlySerializableNativeType, isTypeTypedArray, logError, nameof} from './helpers'; import {OptionsBase} from './options-base'; import {TypeDescriptor} from './type-descriptor'; -import {IndexedObject, Serializable, TypeThunk} from './types'; +import {IndexedObject, Serializable} from './types'; export const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; diff --git a/src/serializer.ts b/src/serializer.ts index 1f9df4d..ff8ca5b 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -1,4 +1,3 @@ -import {DeserializerFn} from './deserializer'; import { identity, isInstanceOf, diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 47d5d01..2a0e6bc 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,3 +1,5 @@ +import {MaybeTypeThunk, TypeThunk} from './types'; + export abstract class TypeDescriptor { protected constructor(readonly ctor: Function) { } @@ -129,3 +131,16 @@ export function isTypelike(type: any): type is Typelike { export function ensureTypeDescriptor(type: Typelike): TypeDescriptor { return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); } + +export function ensureTypeThunk(typeThunkOrSerializable: MaybeTypeThunk): TypeThunk { + if (typeThunkOrSerializable instanceof TypeDescriptor) { + return () => typeThunkOrSerializable; + } + + if (typeThunkOrSerializable.name !== '') { + // Function is not anonymous and as such should not be a thunk + return () => typeThunkOrSerializable; + } + + return typeThunkOrSerializable as TypeThunk; +} diff --git a/src/types.ts b/src/types.ts index 993a765..70ae8bd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,6 +3,7 @@ import {TypeDescriptor} from './type-descriptor'; export type IndexedObject = Object & {[key: string]: any}; export type TypeThunk = () => Serializable | TypeDescriptor; +export type MaybeTypeThunk = Serializable | TypeDescriptor | TypeThunk; export interface AbstractType extends Function { prototype: T; From c427ed0ea7126f3bd7fc9b4a5dd40d03883c4b23 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 26 Jan 2021 14:56:32 +0000 Subject: [PATCH 086/119] Improve unresolvable type error messages --- src/helpers.ts | 7 +++++-- src/json-array-member.ts | 3 +-- src/json-map-member.ts | 5 ++--- src/json-member.ts | 37 +++++++++++++++++-------------------- src/json-set-member.ts | 3 +-- src/type-descriptor.ts | 10 +++++++++- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/helpers.ts b/src/helpers.ts index 4383989..fcfb242 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -5,8 +5,11 @@ declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; } -export const MISSING_REFLECT_CONF_MSG = 'Are you sure, that you have both "experimentalDecorators"' - + ' and "emitDecoratorMetadata" in your tsconfig.json?'; +export const LAZY_TYPE_EXPLANATION = `If the type is not yet defined, for example due to circular \ +references, add '() => ' before it. E.g. @jsonMember(() => Foo)`; + +export const MISSING_REFLECT_CONF_MSG = 'Make sure that you have both "experimentalDecorators"' + + ' and "emitDecoratorMetadata" enabled in your tsconfig.json'; /** * Determines whether the specified type is a type that can be passed on "as-is" into diff --git a/src/json-array-member.ts b/src/json-array-member.ts index b8a379a..9c41cab 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -46,11 +46,10 @@ export function jsonArrayMember( maybeTypeThunk: MaybeTypeThunk, options: IJsonArrayMemberOptions = {}, ) { - const typeThunk: TypeThunk = ensureTypeThunk(maybeTypeThunk); - return (target: Object, propKey: string | symbol) => { const decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; + const typeThunk: TypeThunk = ensureTypeThunk(maybeTypeThunk, decoratorName); const dimensions = options.dimensions == null ? 1 : options.dimensions; if (!isNaN(dimensions) && dimensions < 1) { diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 5a385ca..7a566f8 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -40,12 +40,11 @@ export function jsonMapMember( maybeValueThunk: MaybeTypeThunk, options: IJsonMapMemberOptions = {}, ) { - const keyThunk = ensureTypeThunk(maybeKeyThunk); - const valueThunk = ensureTypeThunk(maybeValueThunk); - return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; + const keyThunk = ensureTypeThunk(maybeKeyThunk, decoratorName); + const valueThunk = ensureTypeThunk(maybeValueThunk, decoratorName); // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used // on a map. Warn if not. diff --git a/src/json-member.ts b/src/json-member.ts index 578fb97..19084f3 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -2,6 +2,7 @@ import { isReflectMetadataSupported, isSubtypeOf, isValueDefined, + LAZY_TYPE_EXPLANATION, logError, logWarning, MISSING_REFLECT_CONF_MSG, @@ -88,10 +89,8 @@ export function jsonMember( // propKey. // Obtain property constructor through ReflectDecorators. if (!isReflectMetadataSupported) { - logError( - `${decoratorName}: ReflectDecorators is required if no 'constructor' option is` - + ` specified.`, - ); + logError(`${decoratorName}: ReflectDecorators is required if the type is not \ +explicitly provided with e.g. @jsonMember(Number)`); return; } @@ -99,10 +98,10 @@ export function jsonMember( Reflect.getMetadata('design:type', prototype, property); if (reflectPropCtor == null) { - logError( - `${decoratorName}: could not resolve detected property constructor at runtime.${ - MISSING_REFLECT_CONF_MSG}`, - ); + logError(`${decoratorName}: could not resolve detected property constructor at \ +runtime. Potential solutions: + - ${LAZY_TYPE_EXPLANATION} + - ${MISSING_REFLECT_CONF_MSG}`); return; } @@ -121,27 +120,27 @@ export function jsonMember( // jsonMember used as a decorator factory. return (target: Object, _propKey: string | symbol) => { + const decoratorName = + `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; const hasTypeThunk = typeof optionsOrPrototype === 'function'; const typeThunk = hasTypeThunk - ? ensureTypeThunk(optionsOrPrototype as any) + ? ensureTypeThunk(optionsOrPrototype as any, decoratorName) : undefined; const options = (hasTypeThunk ? propertyKeyOrOptions : optionsOrPrototype) as IJsonMemberOptions ?? {}; let typeDescriptor: TypeThunk | undefined; - const decoratorName = - `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; if (options.hasOwnProperty('constructor')) { if (hasTypeThunk) { - throw new Error('Cannot both define constructor and type. Only one allowed.'); + throw new Error( + 'Cannot both define constructor option and type. Only one allowed.', + ); } if (!isValueDefined(options.constructor)) { - logError( - `${decoratorName}: cannot resolve specified property constructor at` - + ' runtime.', - ); + logError(`${decoratorName}: cannot resolve specified property constructor at \ +runtime. ${LAZY_TYPE_EXPLANATION}`); return; } @@ -168,10 +167,8 @@ export function jsonMember( ) as Function | null | undefined; if (reflectCtor == null) { - logError( - `${decoratorName}: cannot resolve detected property constructor at` - + ` runtime.`, - ); + logError(`${decoratorName}: cannot resolve detected property constructor at\ +runtime. ${LAZY_TYPE_EXPLANATION}`); return; } typeDescriptor = () => ensureTypeDescriptor(reflectCtor); diff --git a/src/json-set-member.ts b/src/json-set-member.ts index b0c56e8..01f616f 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -36,11 +36,10 @@ export interface IJsonSetMemberOptions extends OptionsBase { * @param options Additional options. */ export function jsonSetMember(maybeTypeThunk: MaybeTypeThunk, options: IJsonSetMemberOptions = {}) { - const typeThunk = ensureTypeThunk(maybeTypeThunk); - return (target: Object, propKey: string | symbol) => { // For error messages const decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; + const typeThunk = ensureTypeThunk(maybeTypeThunk, decoratorName); // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used // on a set. Warn if not. diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 2a0e6bc..1a5ccdd 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,3 +1,4 @@ +import {LAZY_TYPE_EXPLANATION, logError} from './helpers'; import {MaybeTypeThunk, TypeThunk} from './types'; export abstract class TypeDescriptor { @@ -132,7 +133,14 @@ export function ensureTypeDescriptor(type: Typelike): TypeDescriptor { return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); } -export function ensureTypeThunk(typeThunkOrSerializable: MaybeTypeThunk): TypeThunk { +export function ensureTypeThunk( + typeThunkOrSerializable: MaybeTypeThunk | null | undefined, + decoratorName: string, +): TypeThunk { + if (typeThunkOrSerializable == null) { + throw new Error(`No type given on ${decoratorName}. ${LAZY_TYPE_EXPLANATION}`); + } + if (typeThunkOrSerializable instanceof TypeDescriptor) { return () => typeThunkOrSerializable; } From 0e6c864c6494cb3fddc4e25d8e1cb81ed9092feb Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 26 Jan 2021 14:58:34 +0000 Subject: [PATCH 087/119] Update README with backwards compatible lazy types --- readme.md | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/readme.md b/readme.md index ed92ecb..3b3cd9a 100644 --- a/readme.md +++ b/readme.md @@ -78,13 +78,13 @@ import { jsonObject, jsonArrayMember, jsonSetMember, jsonMapMember, TypedJSON } @jsonObject class MyDataClass { - @jsonArrayMember(() => Number) + @jsonArrayMember(Number) public prop1: number[]; - @jsonSetMember(() => String) + @jsonSetMember(String) public prop2: Set; - @jsonMapMember(() => Number, () => MySecondDataClass) + @jsonMapMember(Number, MySecondDataClass) public prop3: Map; } ``` @@ -117,10 +117,10 @@ class MyDataClass @jsonMember public prop1: MySecondDataClass; - @jsonArrayMember(() => MySecondDataClass) + @jsonArrayMember(MySecondDataClass) public arrayProp: MySecondDataClass[]; - @jsonMapMember(() => Number, () => MySecondDataClass) + @jsonMapMember(Number, MySecondDataClass) public mapProp: Map; } ``` @@ -133,7 +133,7 @@ import {Any, jsonObject, jsonMember} from 'typedjson'; @jsonObject class Something { - @jsonMember(() => Any) + @jsonMember(Any) anythingGoes: any; } ``` @@ -150,11 +150,11 @@ Without ReflectDecorators, `@jsonMember` requires an additional type argument, b class MyDataClass { - @jsonMember -+ @jsonMember(() => Number) ++ @jsonMember(Number) public prop1: number; - @jsonMember -+ @jsonMember(() => MySecondDataClass) ++ @jsonMember(MySecondDataClass) public prop2: MySecondDataClass; } ``` @@ -236,6 +236,27 @@ class Model { } ``` +## Circular references and using types before they are defined +In case you have to use a type before it is defined, or your find yourself in need a data structure with circular references, errors can occur. To resolve these errors, specify the type lazily by using an arrow function as follows: + +```diff + import {jsonObject, jsonMember} from 'typedjson'; + + @jsonObject + class Foo { +- @jsonMember(Bar) ++ @jsonMember(() => Bar) + bar: Bar; + } + + @jsonObject + class Bar { +- @jsonMember(Foo) ++ @jsonMember(() => Foo) + foo: Foo; + } +``` + ## Limitations ### Type-definitions @@ -267,10 +288,10 @@ import { jsonObject, jsonArrayMember, TypedJSON } from 'typedjson'; @jsonObject class MyDataClass { - @jsonArrayMember(() => Number, { dimensions: 2 }) + @jsonArrayMember(Number, { dimensions: 2 }) public prop1: number[][]; - @jsonArrayMember(() => Number, { dimensions: 3 }) + @jsonArrayMember(Number, { dimensions: 3 }) public prop2: number[][][]; } ``` From 015088beb3782451b3948d62de20021fd5d1b559 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Fri, 22 Jan 2021 13:30:16 +0000 Subject: [PATCH 088/119] Document mapping types --- readme.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/readme.md b/readme.md index 3b3cd9a..8fe3b02 100644 --- a/readme.md +++ b/readme.md @@ -67,6 +67,41 @@ const object3 = serializer.parse('{ "prop1": 1, "prop2": "2" }'); object3 instanceof MyDataClass; // true ``` +### Mapping types + +At times, you might find yourself using a custom type such as `Point`, `Decimal`, or `BigInt`. In this case, `TypedJSON.mapType` can be used to define serialization and deserialization functions to prevent the need of repeating on each member. Example: + +```typescript +import {jsonObject, jsonMember, TypedJSON} from 'typedjson'; +import * as Decimal from 'decimal.js'; // Or any other library your type originates from + +TypedJSON.mapType(BigInt, { + deserializer: json => new BigInt(json), + serializer: value => value.toString(), +}); + +TypedJSON.mapType(Decimal, { + deserializer: json => new Decimal(json), + serializer: value => value.toString(), +}); + +@jsonObject +class MappedTypes { + + @jsonMember + cryptoKey: BigInt; + + @jsonMember + money: Decimal; +} + +const result = TypedJSON.parse({cryptoKey: '1234567890123456789', money: '12345.67'}, MappedTypes); +console.log(result.money instanceof Decimal); // true +console.log(typeof result.cryptoKey === 'bigint'); // true +``` + +Do note that in order to prevent the values from being parsed as `Number`, losing precision in the process, they have to be strings. + ### Collections Properties which are of type Array, Set, or Map require the special `@jsonArrayMember`, `@jsonSetMember` and `@jsonMapMember` property decorators (respectively), which require a type argument for members (and keys in case of Maps). For primitive types, the type arguments are the corresponding wrapper types, which the following example showcases. Everything else works the same way: From 62aa57af803c6ad09f10e979f2a069168b4d167c Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 23 Jan 2021 22:20:00 +0000 Subject: [PATCH 089/119] Deal with null and undefined in mapType documentation --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 8fe3b02..ef3a8ff 100644 --- a/readme.md +++ b/readme.md @@ -76,13 +76,13 @@ import {jsonObject, jsonMember, TypedJSON} from 'typedjson'; import * as Decimal from 'decimal.js'; // Or any other library your type originates from TypedJSON.mapType(BigInt, { - deserializer: json => new BigInt(json), - serializer: value => value.toString(), + deserializer: json => value == null ? value : new BigInt(json), + serializer: value => value == null ? value : value.toString(), }); TypedJSON.mapType(Decimal, { - deserializer: json => new Decimal(json), - serializer: value => value.toString(), + deserializer: json => value == null ? value : new Decimal(json), + serializer: value => value == null ? value : value.toString(), }); @jsonObject From 158a90d333016d03663a55cca66e2dbaf24cf18a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Wed, 27 Jan 2021 11:20:39 +0100 Subject: [PATCH 090/119] 1.7.0-rc1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d12918..7e75d70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.6.0", + "version": "1.7.0-rc1", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From f0038f58e3625b1dc0df672151aae88075ed30df Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 27 Jan 2021 03:15:12 +0000 Subject: [PATCH 091/119] Fix AnyT documentation in README --- readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index ef3a8ff..ff9a5c1 100644 --- a/readme.md +++ b/readme.md @@ -161,14 +161,14 @@ class MyDataClass ``` ### Any type -In case you don't want TypedJSON to make any conversion the `Any` type can be used. +In case you don't want TypedJSON to make any conversion the `AnyT` type can be used. ```typescript -import {Any, jsonObject, jsonMember} from 'typedjson'; +import {AnyT, jsonObject, jsonMember} from 'typedjson'; @jsonObject class Something { - @jsonMember(Any) + @jsonMember(AnyT) anythingGoes: any; } ``` From 5d3aadd845b4466c5ce1bae98be2c9e1af016982 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 27 Jan 2021 15:58:46 +0000 Subject: [PATCH 092/119] Fix deserializers in mapType documentation --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index ff9a5c1..b781b2f 100644 --- a/readme.md +++ b/readme.md @@ -76,12 +76,12 @@ import {jsonObject, jsonMember, TypedJSON} from 'typedjson'; import * as Decimal from 'decimal.js'; // Or any other library your type originates from TypedJSON.mapType(BigInt, { - deserializer: json => value == null ? value : new BigInt(json), + deserializer: json => json == null ? json : BigInt(json), serializer: value => value == null ? value : value.toString(), }); TypedJSON.mapType(Decimal, { - deserializer: json => value == null ? value : new Decimal(json), + deserializer: json => json == null ? json : new Decimal(json), serializer: value => value == null ? value : value.toString(), }); From 3909df716a036bc20cf56e143cd62c5860b789b6 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 27 Jan 2021 16:19:49 +0000 Subject: [PATCH 093/119] Fix BigInt example in README --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index b781b2f..9708c45 100644 --- a/readme.md +++ b/readme.md @@ -89,7 +89,7 @@ TypedJSON.mapType(Decimal, { class MappedTypes { @jsonMember - cryptoKey: BigInt; + cryptoKey: bigint; @jsonMember money: Decimal; From b1b688a24a1e2dd8a46ee2e6d56ad6f4a6751f2f Mon Sep 17 00:00:00 2001 From: John Weisz Date: Thu, 28 Jan 2021 11:52:35 +0100 Subject: [PATCH 094/119] Update readme.md --- readme.md | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 9708c45..16066df 100644 --- a/readme.md +++ b/readme.md @@ -271,28 +271,57 @@ class Model { } ``` -## Circular references and using types before they are defined -In case you have to use a type before it is defined, or your find yourself in need a data structure with circular references, errors can occur. To resolve these errors, specify the type lazily by using an arrow function as follows: +## Limitations + +### Declaration order & circular class dependencies + +Because of how decorators work at runtime, dependent class declaration order matters in TypedJSON. If a dependency is referenced before it is declared, it will result in an undefined reference and cause errors: + +``` +@jsonObject +class Foo { + @jsonMember // error, because Bar is only defined later + bar: Bar; + + @jsonMember(Bar) // error, because Bar is only defined later + baz: Bar; +} + + +@jsonObject +class Bar { + @jsonMember + foo: Foo; +} +``` + +This can be resolved by fixing the declaration order of your dependent classes (i.e. by moving `Bar` before `Foo` in the above example). + +In cases where this is not possible (most commonly because of a circular class-dependency), the more flexible lazy type definition syntax can be used instead: ```diff import {jsonObject, jsonMember} from 'typedjson'; @jsonObject class Foo { -- @jsonMember(Bar) +- @jsonMember + @jsonMember(() => Bar) bar: Bar; + +- @jsonMember(Bar) ++ @jsonMember(() => Bar) + baz: Bar; } @jsonObject class Bar { -- @jsonMember(Foo) +- @jsonMember + @jsonMember(() => Foo) foo: Foo; } ``` -## Limitations +_Note: this is necessary even when inferring the type from the TypeScript type-annotation, requiring the use of an explicit lazy type definition at all times._ ### Type-definitions @@ -314,7 +343,7 @@ Instead, prefer creating the necessary class-structure for your object tree. ### Multi-dimensional arrays -TypedJSON only supports multi-dimensional arrays of a single type (can be polymorphic), and requires specifying the array dimension: +TypedJSON only supports multi-dimensional arrays of a single type (can be polymorphic), and requires specifying the array dimension to do so: ```typescript import 'reflect-metadata'; From dd73d24ac69e403d77c96f179c079261bbde731b Mon Sep 17 00:00:00 2001 From: John Weisz Date: Thu, 28 Jan 2021 11:53:29 +0100 Subject: [PATCH 095/119] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 16066df..472cfe6 100644 --- a/readme.md +++ b/readme.md @@ -277,7 +277,7 @@ class Model { Because of how decorators work at runtime, dependent class declaration order matters in TypedJSON. If a dependency is referenced before it is declared, it will result in an undefined reference and cause errors: -``` +```typescript @jsonObject class Foo { @jsonMember // error, because Bar is only defined later From b430920f4e1957f2979a065dae9ac3dc1f69f252 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 05:31:09 +0000 Subject: [PATCH 096/119] Prevent unused imports, variables, ... --- .github/workflows/nodejs.yml | 1 + lint-staged.config.js | 2 +- package.json | 3 +++ spec/base.spec.ts | 2 ++ src/deserializer.ts | 5 ----- src/json-object.ts | 4 ---- src/type-descriptor.ts | 2 +- tsconfig/README.md | 6 ++++++ tsconfig/tsconfig.app-strict.json | 6 ++++++ tsconfig/tsconfig.spec-strict.json | 6 ++++++ 10 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 tsconfig/tsconfig.app-strict.json create mode 100644 tsconfig/tsconfig.spec-strict.json diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 61d884b..ca76b45 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -23,6 +23,7 @@ jobs: yarn run lint yarn run build yarn run coverage + yarn run test:ts yarn run size env: CI: true diff --git a/lint-staged.config.js b/lint-staged.config.js index c976e58..6f9949a 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -4,8 +4,8 @@ function mapFilenames(filenames) { module.exports = { '*': () => [ - 'tsc -p tsconfig/tsconfig.app.json', 'yarn run test', + 'yarn run test:ts', ], '*.ts': (filenames) => [ `eslint --fix --cache ${mapFilenames(filenames)}`, diff --git a/package.json b/package.json index 7e75d70..3a5e597 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "test": "yarn run test:base node_modules/jasmine/bin/jasmine.js", "test:base": "TS_NODE_PROJECT=tsconfig/tsconfig.spec.json node -r ts-node/register", "test:inspect": "yarn run test:base --inspect-brk node_modules/jasmine/bin/jasmine.js", + "test:ts": "run-p test:ts:*", + "test:ts:src": "tsc -p tsconfig/tsconfig.app-strict.json", + "test:ts:spec": "tsc -p tsconfig/tsconfig.spec-strict.json", "version": "yarn run build" }, "repository": { diff --git a/spec/base.spec.ts b/spec/base.spec.ts index 6eef90b..dbe6b50 100644 --- a/spec/base.spec.ts +++ b/spec/base.spec.ts @@ -213,6 +213,8 @@ describe('basic serialization of', () => { return this._getterOnly; } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore private _setterOnly: string = 'setter'; @jsonMember set setterOnly(val: string) { diff --git a/src/deserializer.ts b/src/deserializer.ts index 0ca4503..d3fb9b9 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -181,11 +181,6 @@ export class Deserializer { retrievePreserveNull(memberOptions?: OptionsBase): boolean { return getOptionValue('preserveNull', mergeOptions(this.options, memberOptions)); } - - private isExpectedMapShape(source: any, expectedShape: MapShape): boolean { - return (expectedShape === MapShape.ARRAY && Array.isArray(source)) - || (expectedShape === MapShape.OBJECT && typeof source === 'object'); - } } function throwTypeMismatchError( diff --git a/src/json-object.ts b/src/json-object.ts index 6f875d1..5aad869 100644 --- a/src/json-object.ts +++ b/src/json-object.ts @@ -137,7 +137,3 @@ export function jsonObject( return decorator; } } - -function isSubClass(target: Serializable) { - return; -} diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 1a5ccdd..f17a2fa 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,4 +1,4 @@ -import {LAZY_TYPE_EXPLANATION, logError} from './helpers'; +import {LAZY_TYPE_EXPLANATION} from './helpers'; import {MaybeTypeThunk, TypeThunk} from './types'; export abstract class TypeDescriptor { diff --git a/tsconfig/README.md b/tsconfig/README.md index fb154e2..7e7fb4b 100644 --- a/tsconfig/README.md +++ b/tsconfig/README.md @@ -8,6 +8,9 @@ Used by language services to interpret and check library source code. **[tsconfig.app-base.json](tsconfig.app-base.json)** Governs all library source files. Used as base for production bundles and `tsconfig.app.json`. +**[tsconfig.app-strict.json](tsconfig.app-strict.json)** +A more strict TypeScript configuration which might be annoying if used during development. + **[tsconfig.base.json](tsconfig.base.json)** tsconfig.json on which all other configs are based. Used to define settings across the whole library. @@ -31,3 +34,6 @@ Used by eslint, see [.eslintrc.yaml](../.eslintrc.yaml). **[tsconfig.spec.json](tsconfig.spec.json)** Governs all test files. + +**[tsconfig.spec-strict.json](tsconfig.spec-strict.json)** +A more strict TypeScript configuration which might be annoying if used during development. diff --git a/tsconfig/tsconfig.app-strict.json b/tsconfig/tsconfig.app-strict.json new file mode 100644 index 0000000..dcf945b --- /dev/null +++ b/tsconfig/tsconfig.app-strict.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "noUnusedLocals": true + } +} diff --git a/tsconfig/tsconfig.spec-strict.json b/tsconfig/tsconfig.spec-strict.json new file mode 100644 index 0000000..3db9ea8 --- /dev/null +++ b/tsconfig/tsconfig.spec-strict.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.spec.json", + "compilerOptions": { + "noUnusedLocals": true + } +} From 1bb5dc91eb6d2f38aa491faffa2e03a9de11b729 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 28 Jan 2021 17:19:07 +0000 Subject: [PATCH 097/119] Test AnyT more thoroughly --- spec/any.spec.ts | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 spec/any.spec.ts diff --git a/spec/any.spec.ts b/spec/any.spec.ts new file mode 100644 index 0000000..e649d2c --- /dev/null +++ b/spec/any.spec.ts @@ -0,0 +1,148 @@ +import {AnyT, jsonArrayMember, jsonMember, jsonObject, jsonSetMember, TypedJSON} from '../src'; + +describe('AnyT', () => { + class Foo { + constructor(public foo: string) { + } + } + + describe('on a simple class property', () => { + @jsonObject + class SimplePropertyAny { + @jsonMember(AnyT) + any: any; + + @jsonMember(AnyT) + anyNullable?: any | null; + } + + it('should deserialize simple object correctly', () => { + const result = TypedJSON.parse({ + any: {foo: 'bar'}, + anyNullable: {foo: 'bar'}, + }, SimplePropertyAny); + expect(result.any).toHaveProperties(['foo']); + expect(result.anyNullable).toHaveProperties(['foo']); + }); + + it('should deserialize class instance correctly', () => { + const result = TypedJSON.parse({ + any: new Foo('bar'), + anyNullable: new Foo('bar'), + }, SimplePropertyAny); + expect(result.any).toBeInstanceOf(Foo); + expect(result.any.foo).toEqual('bar'); + expect(result.anyNullable).toBeInstanceOf(Foo); + expect(result.anyNullable.foo).toEqual('bar'); + }); + }); + + describe('on arrays', () => { + @jsonObject + class ArrayPropertyAny { + @jsonArrayMember(AnyT) + any: Array; + + @jsonArrayMember(AnyT) + anyNullable?: Array | null; + } + + it('should deserialize simple object correctly', () => { + const result = TypedJSON.parse({ + any: [{foo: 'bar'}], + anyNullable: [{foo: 'bar'}], + }, ArrayPropertyAny); + expect(result.any).toBeInstanceOf(Array); + expect(result.any[0].foo).toEqual('bar'); + expect(result.anyNullable).toBeInstanceOf(Array); + expect(result.anyNullable[0].foo).toEqual('bar'); + }); + + it('should deserialize class instance correctly', () => { + const result = TypedJSON.parse({ + any: [new Foo('bar')], + anyNullable: [new Foo('bar')], + }, ArrayPropertyAny); + expect(result.any).toBeInstanceOf(Array); + expect(result.any[0]).toBeInstanceOf(Foo); + expect(result.any[0].foo).toEqual('bar'); + expect(result.anyNullable).toBeInstanceOf(Array); + expect(result.anyNullable[0]).toBeInstanceOf(Foo); + expect(result.anyNullable[0].foo).toEqual('bar'); + }); + }); + + describe('on set', () => { + @jsonObject + class SetPropertyAny { + + @jsonSetMember(AnyT) + any: Set; + + @jsonSetMember(AnyT) + anyNullable?: Set | null; + } + + it('should deserialize simple object correctly', () => { + const foo = {foo: 'bar'}; + const result = TypedJSON.parse({ + any: [foo, foo], + anyNullable: [foo, foo], + }, SetPropertyAny); + expect(result.any).toBeInstanceOf(Set); + expect(result.any.size).toBe(1); + expect(result.any.values().next().value.foo).toEqual('bar'); + expect(result.anyNullable).toBeInstanceOf(Set); + expect(result.anyNullable.size).toBe(1); + expect(result.anyNullable.values().next().value.foo).toEqual('bar'); + }); + + it('should deserialize class instance correctly', () => { + const foo = new Foo('bar'); + const result = TypedJSON.parse({ + any: [foo, foo], + anyNullable: [foo, foo], + }, SetPropertyAny); + expect(result.any).toBeInstanceOf(Set); + const firstValueAny = result.any.values().next().value; + expect(firstValueAny).toBeInstanceOf(Foo); + expect(firstValueAny.foo).toEqual('bar'); + expect(result.anyNullable).toBeInstanceOf(Set); + const firstValueAnyNullable = result.anyNullable.values().next().value; + expect(firstValueAnyNullable).toBeInstanceOf(Foo); + expect(firstValueAnyNullable.foo).toEqual('bar'); + }); + }); + + it('should handle complex structures', () => { + @jsonObject + class Event { + + @jsonMember(AnyT) + data?: {[k: string]: any} | null; + } + + @jsonObject + class A { + + @jsonArrayMember(Event) + events: Array + } + + const result = TypedJSON.parse({ + events: [ + { + data: { + files: [ + { + name: 'file1', + }, + ], + }, + }, + ], + }, A); + + expect(result.events[0].data.files[0].name).toEqual('file1'); + }); +}); From bb04847d74424f5a4b6a3d459fa1929b10c934e8 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 28 Jan 2021 18:34:51 +0000 Subject: [PATCH 098/119] Fix handling of TypeDescriptor in @jsonMember --- src/json-member.ts | 16 ++++++++-------- src/type-descriptor.ts | 12 +++++++++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index 19084f3..cd1422a 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -14,6 +14,7 @@ import { ArrayTypeDescriptor, ensureTypeDescriptor, ensureTypeThunk, + isMaybeTypeThunk, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, @@ -122,17 +123,16 @@ runtime. Potential solutions: return (target: Object, _propKey: string | symbol) => { const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; - const hasTypeThunk = typeof optionsOrPrototype === 'function'; - const typeThunk = hasTypeThunk - ? ensureTypeThunk(optionsOrPrototype as any, decoratorName) + const typeThunk = isMaybeTypeThunk(optionsOrPrototype) + ? ensureTypeThunk(optionsOrPrototype, decoratorName) : undefined; - const options = (hasTypeThunk - ? propertyKeyOrOptions - : optionsOrPrototype) as IJsonMemberOptions ?? {}; + const options: IJsonMemberOptions = (typeThunk === undefined + ? optionsOrPrototype + : propertyKeyOrOptions) as IJsonMemberOptions ?? {}; let typeDescriptor: TypeThunk | undefined; if (options.hasOwnProperty('constructor')) { - if (hasTypeThunk) { + if (typeThunk !== undefined) { throw new Error( 'Cannot both define constructor option and type. Only one allowed.', ); @@ -157,7 +157,7 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); + ` 'constructor' option.`, ); } - } else if (hasTypeThunk) { + } else if (typeThunk !== undefined) { typeDescriptor = typeThunk; } else if (isReflectMetadataSupported) { const reflectCtor = Reflect.getMetadata( diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index f17a2fa..0916caa 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,5 +1,6 @@ import {LAZY_TYPE_EXPLANATION} from './helpers'; -import {MaybeTypeThunk, TypeThunk} from './types'; +import {IJsonMemberOptions} from './json-member'; +import {IndexedObject, MaybeTypeThunk, TypeThunk} from './types'; export abstract class TypeDescriptor { protected constructor(readonly ctor: Function) { @@ -152,3 +153,12 @@ export function ensureTypeThunk( return typeThunkOrSerializable as TypeThunk; } + +/** + * Checks if the given value is a `MaybeTypeThunk`. + */ +export function isMaybeTypeThunk( + type: IndexedObject | IJsonMemberOptions | MaybeTypeThunk | undefined | null, +): type is MaybeTypeThunk { + return type === 'function' || type instanceof TypeDescriptor; +} From 2dbde997a5cd1bfccaa3784bb5439da04f59adc1 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 28 Jan 2021 18:45:32 +0000 Subject: [PATCH 099/119] Extract jsonMember decorator factory to avoid casting --- src/json-member.ts | 54 +++++++++++++++++++++++------------------- src/type-descriptor.ts | 9 ------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index cd1422a..19fcfcf 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -14,7 +14,6 @@ import { ArrayTypeDescriptor, ensureTypeDescriptor, ensureTypeThunk, - isMaybeTypeThunk, MapTypeDescriptor, SetTypeDescriptor, TypeDescriptor, @@ -79,8 +78,7 @@ export function jsonMember( optionsOrPrototype?: IndexedObject | IJsonMemberOptions | MaybeTypeThunk, propertyKeyOrOptions?: string | symbol | IJsonMemberOptions, ): PropertyDecorator | void { - if (propertyKeyOrOptions !== undefined - && (typeof propertyKeyOrOptions === 'string' || typeof propertyKeyOrOptions === 'symbol')) { + if (typeof propertyKeyOrOptions === 'string' || typeof propertyKeyOrOptions === 'symbol') { const property = propertyKeyOrOptions as string; const prototype = optionsOrPrototype as IndexedObject; // For error messages. @@ -120,16 +118,24 @@ runtime. Potential solutions: } // jsonMember used as a decorator factory. - return (target: Object, _propKey: string | symbol) => { - const decoratorName = - `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; - const typeThunk = isMaybeTypeThunk(optionsOrPrototype) - ? ensureTypeThunk(optionsOrPrototype, decoratorName) - : undefined; - const options: IJsonMemberOptions = (typeThunk === undefined - ? optionsOrPrototype - : propertyKeyOrOptions) as IJsonMemberOptions ?? {}; - let typeDescriptor: TypeThunk | undefined; + return jsonMemberDecoratorFactory(optionsOrPrototype, propertyKeyOrOptions); +} + +function jsonMemberDecoratorFactory( + optionsOrType: IJsonMemberOptions | MaybeTypeThunk | undefined, + options: IJsonMemberOptions | undefined, +): PropertyDecorator { + return (target, property) => { + const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(property)}`; + let typeThunk: TypeThunk | undefined; + + if (typeof optionsOrType === 'function' || optionsOrType instanceof TypeDescriptor) { + typeThunk = ensureTypeThunk(optionsOrType, decoratorName); + } else { + options = optionsOrType; + } + + options = options ?? {}; if (options.hasOwnProperty('constructor')) { if (typeThunk !== undefined) { @@ -147,10 +153,10 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); // Property constructor has been specified. Use ReflectDecorators (if available) to // check whether that constructor is correct. Warn if not. const newTypeDescriptor = ensureTypeDescriptor(options.constructor); - typeDescriptor = () => newTypeDescriptor; + typeThunk = () => newTypeDescriptor; if (isReflectMetadataSupported && !isSubtypeOf( newTypeDescriptor.ctor, - Reflect.getMetadata('design:type', target, _propKey), + Reflect.getMetadata('design:type', target, property), )) { logWarning( `${decoratorName}: detected property type does not match` @@ -158,12 +164,12 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); ); } } else if (typeThunk !== undefined) { - typeDescriptor = typeThunk; + // Do nothing } else if (isReflectMetadataSupported) { const reflectCtor = Reflect.getMetadata( 'design:type', target, - _propKey, + property, ) as Function | null | undefined; if (reflectCtor == null) { @@ -171,27 +177,27 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); runtime. ${LAZY_TYPE_EXPLANATION}`); return; } - typeDescriptor = () => ensureTypeDescriptor(reflectCtor); + typeThunk = () => ensureTypeDescriptor(reflectCtor); } else if (options.deserializer === undefined) { logError(`${decoratorName}: Cannot determine type`); return; } - const typeToTest = typeDescriptor?.(); + const typeToTest = typeThunk?.(); if (typeToTest !== undefined && isSpecialPropertyType(decoratorName, typeToTest)) { return; } - injectMetadataInformation(target, _propKey, { - type: typeDescriptor === undefined + injectMetadataInformation(target, property, { + type: typeThunk === undefined ? undefined - : () => ensureTypeDescriptor(typeDescriptor!()), + : () => ensureTypeDescriptor(typeThunk!()), emitDefaultValue: options.emitDefaultValue, isRequired: options.isRequired, options: extractOptionBase(options), - key: _propKey.toString(), - name: options.name ?? _propKey.toString(), + key: property.toString(), + name: options.name ?? property.toString(), deserializer: options.deserializer, serializer: options.serializer, }); diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 0916caa..74c267c 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -153,12 +153,3 @@ export function ensureTypeThunk( return typeThunkOrSerializable as TypeThunk; } - -/** - * Checks if the given value is a `MaybeTypeThunk`. - */ -export function isMaybeTypeThunk( - type: IndexedObject | IJsonMemberOptions | MaybeTypeThunk | undefined | null, -): type is MaybeTypeThunk { - return type === 'function' || type instanceof TypeDescriptor; -} From dc5a5c721908c315a25e7009bce938533c533ddd Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Thu, 28 Jan 2021 20:11:00 +0000 Subject: [PATCH 100/119] Fix no space in cannot resolve dedected property error --- src/json-member.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/json-member.ts b/src/json-member.ts index 19fcfcf..f8586fc 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -173,7 +173,7 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); ) as Function | null | undefined; if (reflectCtor == null) { - logError(`${decoratorName}: cannot resolve detected property constructor at\ + logError(`${decoratorName}: cannot resolve detected property constructor at \ runtime. ${LAZY_TYPE_EXPLANATION}`); return; } From 1f233585a25f328640db0454a9dbef271e602682 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 05:01:08 +0000 Subject: [PATCH 101/119] Remove unused imports --- src/type-descriptor.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 74c267c..f17a2fa 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,6 +1,5 @@ import {LAZY_TYPE_EXPLANATION} from './helpers'; -import {IJsonMemberOptions} from './json-member'; -import {IndexedObject, MaybeTypeThunk, TypeThunk} from './types'; +import {MaybeTypeThunk, TypeThunk} from './types'; export abstract class TypeDescriptor { protected constructor(readonly ctor: Function) { From 4ca000d6036280aca2b2c6920995ac03b729b341 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 05:10:40 +0000 Subject: [PATCH 102/119] Test reference equality instead of instance of in any tests --- spec/any.spec.ts | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/spec/any.spec.ts b/spec/any.spec.ts index e649d2c..d31c550 100644 --- a/spec/any.spec.ts +++ b/spec/any.spec.ts @@ -26,14 +26,13 @@ describe('AnyT', () => { }); it('should deserialize class instance correctly', () => { + const foo = new Foo('bar'); const result = TypedJSON.parse({ - any: new Foo('bar'), - anyNullable: new Foo('bar'), + any: foo, + anyNullable: foo, }, SimplePropertyAny); - expect(result.any).toBeInstanceOf(Foo); - expect(result.any.foo).toEqual('bar'); - expect(result.anyNullable).toBeInstanceOf(Foo); - expect(result.anyNullable.foo).toEqual('bar'); + expect(result.any).toEqual(foo); + expect(result.anyNullable).toEqual(foo); }); }); @@ -59,16 +58,15 @@ describe('AnyT', () => { }); it('should deserialize class instance correctly', () => { + const foo = new Foo('bar'); const result = TypedJSON.parse({ - any: [new Foo('bar')], - anyNullable: [new Foo('bar')], + any: [foo], + anyNullable: [foo], }, ArrayPropertyAny); expect(result.any).toBeInstanceOf(Array); - expect(result.any[0]).toBeInstanceOf(Foo); - expect(result.any[0].foo).toEqual('bar'); + expect(result.any[0]).toEqual(foo); expect(result.anyNullable).toBeInstanceOf(Array); - expect(result.anyNullable[0]).toBeInstanceOf(Foo); - expect(result.anyNullable[0].foo).toEqual('bar'); + expect(result.anyNullable[0]).toEqual(foo); }); }); @@ -91,10 +89,10 @@ describe('AnyT', () => { }, SetPropertyAny); expect(result.any).toBeInstanceOf(Set); expect(result.any.size).toBe(1); - expect(result.any.values().next().value.foo).toEqual('bar'); + expect(result.any.values().next().value).toEqual(foo); expect(result.anyNullable).toBeInstanceOf(Set); expect(result.anyNullable.size).toBe(1); - expect(result.anyNullable.values().next().value.foo).toEqual('bar'); + expect(result.anyNullable.values().next().value).toEqual(foo); }); it('should deserialize class instance correctly', () => { @@ -104,13 +102,9 @@ describe('AnyT', () => { anyNullable: [foo, foo], }, SetPropertyAny); expect(result.any).toBeInstanceOf(Set); - const firstValueAny = result.any.values().next().value; - expect(firstValueAny).toBeInstanceOf(Foo); - expect(firstValueAny.foo).toEqual('bar'); + expect(result.any.values().next().value).toBe(foo); expect(result.anyNullable).toBeInstanceOf(Set); - const firstValueAnyNullable = result.anyNullable.values().next().value; - expect(firstValueAnyNullable).toBeInstanceOf(Foo); - expect(firstValueAnyNullable.foo).toEqual('bar'); + expect(result.anyNullable.values().next().value).toBe(foo); }); }); From 28346c0268efefb7858a5554322323b187e05592 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 05:16:48 +0000 Subject: [PATCH 103/119] Add serialization test for AnyT --- spec/any.spec.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/spec/any.spec.ts b/spec/any.spec.ts index d31c550..bcaf463 100644 --- a/spec/any.spec.ts +++ b/spec/any.spec.ts @@ -34,6 +34,16 @@ describe('AnyT', () => { expect(result.any).toEqual(foo); expect(result.anyNullable).toEqual(foo); }); + + it('should serialize class instances correctly', () => { + const foo = new Foo('bar'); + const simplePropertyAny = new SimplePropertyAny(); + simplePropertyAny.any = foo; + simplePropertyAny.anyNullable = foo; + const result: any = TypedJSON.toPlainJson(simplePropertyAny, SimplePropertyAny); + expect(result.any).toEqual(foo); + expect(result.anyNullable).toEqual(foo); + }); }); describe('on arrays', () => { @@ -68,6 +78,16 @@ describe('AnyT', () => { expect(result.anyNullable).toBeInstanceOf(Array); expect(result.anyNullable[0]).toEqual(foo); }); + + it('should serialize class instances correctly', () => { + const foo = new Foo('bar'); + const arrayPropertyAny = new ArrayPropertyAny(); + arrayPropertyAny.any = [foo]; + arrayPropertyAny.anyNullable = [foo]; + const result: any = TypedJSON.toPlainJson(arrayPropertyAny, ArrayPropertyAny); + expect(result.any[0]).toEqual(foo); + expect(result.anyNullable[0]).toEqual(foo); + }); }); describe('on set', () => { @@ -106,6 +126,16 @@ describe('AnyT', () => { expect(result.anyNullable).toBeInstanceOf(Set); expect(result.anyNullable.values().next().value).toBe(foo); }); + + it('should serialize class instances correctly', () => { + const foo = new Foo('bar'); + const setPropertyAny = new SetPropertyAny(); + setPropertyAny.any = new Set([foo, foo]); + setPropertyAny.anyNullable = new Set([foo, foo]); + const result: any = TypedJSON.toPlainJson(setPropertyAny, SetPropertyAny); + expect(result.any.values().next().value).toEqual(foo); + expect(result.anyNullable.values().next().value).toEqual(foo); + }); }); it('should handle complex structures', () => { From 695dea309f9b2d828c55c6cd67ef149f5b6cfc93 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 14:04:01 +0000 Subject: [PATCH 104/119] Remove circular reference between types and type-descriptor --- src/json-array-member.ts | 3 ++- src/json-map-member.ts | 3 +-- src/json-member.ts | 4 +++- src/json-set-member.ts | 3 +-- src/type-descriptor.ts | 5 ++++- src/types.ts | 5 ----- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/json-array-member.ts b/src/json-array-member.ts index 9c41cab..622a62a 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -5,9 +5,10 @@ import { ArrayTypeDescriptor, ensureTypeDescriptor, ensureTypeThunk, + MaybeTypeThunk, TypeDescriptor, + TypeThunk, } from './type-descriptor'; -import {MaybeTypeThunk, TypeThunk} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 7a566f8..3ce914a 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -1,8 +1,7 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {ensureTypeThunk, MapOptions, MapT} from './type-descriptor'; -import {MaybeTypeThunk} from './types'; +import {ensureTypeThunk, MapOptions, MapT, MaybeTypeThunk} from './type-descriptor'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; diff --git a/src/json-member.ts b/src/json-member.ts index f8586fc..597355e 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -15,10 +15,12 @@ import { ensureTypeDescriptor, ensureTypeThunk, MapTypeDescriptor, + MaybeTypeThunk, SetTypeDescriptor, TypeDescriptor, + TypeThunk, } from './type-descriptor'; -import {Constructor, IndexedObject, MaybeTypeThunk, TypeThunk} from './types'; +import {Constructor, IndexedObject} from './types'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; diff --git a/src/json-set-member.ts b/src/json-set-member.ts index 01f616f..d2e02ab 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -1,8 +1,7 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; import {injectMetadataInformation} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; -import {ensureTypeThunk, SetT} from './type-descriptor'; -import {MaybeTypeThunk} from './types'; +import {ensureTypeThunk, MaybeTypeThunk, SetT} from './type-descriptor'; declare abstract class Reflect { static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any; diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index f17a2fa..0163ddb 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -1,5 +1,5 @@ import {LAZY_TYPE_EXPLANATION} from './helpers'; -import {MaybeTypeThunk, TypeThunk} from './types'; +import {Serializable} from './types'; export abstract class TypeDescriptor { protected constructor(readonly ctor: Function) { @@ -125,6 +125,9 @@ export const AnyT = new ConcreteTypeDescriptor(() => undefined); // return new DictionaryTypeDescriptor(ensureTypeDescriptor(elementType)); // } +export type TypeThunk = () => Serializable | TypeDescriptor; +export type MaybeTypeThunk = Serializable | TypeDescriptor | TypeThunk; + export function isTypelike(type: any): type is Typelike { return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); } diff --git a/src/types.ts b/src/types.ts index 70ae8bd..5913901 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,10 +1,5 @@ -import {TypeDescriptor} from './type-descriptor'; - export type IndexedObject = Object & {[key: string]: any}; -export type TypeThunk = () => Serializable | TypeDescriptor; -export type MaybeTypeThunk = Serializable | TypeDescriptor | TypeThunk; - export interface AbstractType extends Function { prototype: T; } From 3da2036de6e3b7410a8093c53ef0f2a0c90cd401 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 14:09:19 +0000 Subject: [PATCH 105/119] Use TypeLike where appropriate --- src/json-member.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index 597355e..63dedf4 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -18,6 +18,7 @@ import { MaybeTypeThunk, SetTypeDescriptor, TypeDescriptor, + Typelike, TypeThunk, } from './type-descriptor'; import {Constructor, IndexedObject} from './types'; @@ -31,7 +32,7 @@ export interface IJsonMemberOptions extends OptionsBase { * Sets the constructor of the property. * Optional with ReflectDecorators. */ - constructor?: Function | TypeDescriptor | null; + constructor?: Typelike | null; /** When set, indicates that the member must be present when deserializing. */ isRequired?: boolean | null; @@ -206,11 +207,11 @@ runtime. ${LAZY_TYPE_EXPLANATION}`); }; } -function isConstructorEqual(type: TypeDescriptor | Function, constructor: Constructor) { +function isConstructorEqual(type: Typelike, constructor: Constructor) { return type instanceof TypeDescriptor ? type.ctor === constructor : type === constructor; } -function isSpecialPropertyType(decoratorName: string, typeDescriptor: TypeDescriptor | Function) { +function isSpecialPropertyType(decoratorName: string, typeDescriptor: Typelike) { if (!(typeDescriptor instanceof ArrayTypeDescriptor) && isConstructorEqual(typeDescriptor, Array)) { logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to` From 25d2e9f4559df69e6dff6662ee2ff3ecd0cf8e35 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Sat, 30 Jan 2021 14:12:29 +0000 Subject: [PATCH 106/119] Stop testing (de)serialization of classes for AnyT --- spec/any.spec.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/spec/any.spec.ts b/spec/any.spec.ts index bcaf463..d9fa09c 100644 --- a/spec/any.spec.ts +++ b/spec/any.spec.ts @@ -1,11 +1,6 @@ import {AnyT, jsonArrayMember, jsonMember, jsonObject, jsonSetMember, TypedJSON} from '../src'; describe('AnyT', () => { - class Foo { - constructor(public foo: string) { - } - } - describe('on a simple class property', () => { @jsonObject class SimplePropertyAny { @@ -26,7 +21,7 @@ describe('AnyT', () => { }); it('should deserialize class instance correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const result = TypedJSON.parse({ any: foo, anyNullable: foo, @@ -36,7 +31,7 @@ describe('AnyT', () => { }); it('should serialize class instances correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const simplePropertyAny = new SimplePropertyAny(); simplePropertyAny.any = foo; simplePropertyAny.anyNullable = foo; @@ -68,7 +63,7 @@ describe('AnyT', () => { }); it('should deserialize class instance correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const result = TypedJSON.parse({ any: [foo], anyNullable: [foo], @@ -80,7 +75,7 @@ describe('AnyT', () => { }); it('should serialize class instances correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const arrayPropertyAny = new ArrayPropertyAny(); arrayPropertyAny.any = [foo]; arrayPropertyAny.anyNullable = [foo]; @@ -116,7 +111,7 @@ describe('AnyT', () => { }); it('should deserialize class instance correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const result = TypedJSON.parse({ any: [foo, foo], anyNullable: [foo, foo], @@ -128,7 +123,7 @@ describe('AnyT', () => { }); it('should serialize class instances correctly', () => { - const foo = new Foo('bar'); + const foo = {foo: 'bar'}; const setPropertyAny = new SetPropertyAny(); setPropertyAny.any = new Set([foo, foo]); setPropertyAny.anyNullable = new Set([foo, foo]); From 4e90056b94e97a40cbebe4a53959b5ef7fe404ce Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 2 Feb 2021 00:24:27 +0000 Subject: [PATCH 107/119] Rename AnyT referential equality tests --- spec/any.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/any.spec.ts b/spec/any.spec.ts index d9fa09c..a118e43 100644 --- a/spec/any.spec.ts +++ b/spec/any.spec.ts @@ -30,7 +30,7 @@ describe('AnyT', () => { expect(result.anyNullable).toEqual(foo); }); - it('should serialize class instances correctly', () => { + it('should serialize with referential equality', () => { const foo = {foo: 'bar'}; const simplePropertyAny = new SimplePropertyAny(); simplePropertyAny.any = foo; @@ -74,7 +74,7 @@ describe('AnyT', () => { expect(result.anyNullable[0]).toEqual(foo); }); - it('should serialize class instances correctly', () => { + it('should serialize with referential equality', () => { const foo = {foo: 'bar'}; const arrayPropertyAny = new ArrayPropertyAny(); arrayPropertyAny.any = [foo]; @@ -110,7 +110,7 @@ describe('AnyT', () => { expect(result.anyNullable.values().next().value).toEqual(foo); }); - it('should deserialize class instance correctly', () => { + it('should deserialize with referential equality', () => { const foo = {foo: 'bar'}; const result = TypedJSON.parse({ any: [foo, foo], @@ -122,7 +122,7 @@ describe('AnyT', () => { expect(result.anyNullable.values().next().value).toBe(foo); }); - it('should serialize class instances correctly', () => { + it('should serialize with referential equality', () => { const foo = {foo: 'bar'}; const setPropertyAny = new SetPropertyAny(); setPropertyAny.any = new Set([foo, foo]); From 7c8394fa37be565fd1e5e53064c98fc34c6aa9f3 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 2 Feb 2021 00:28:58 +0000 Subject: [PATCH 108/119] Create isTypeThunk function --- src/json-member.ts | 4 +++- src/type-descriptor.ts | 15 +++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/json-member.ts b/src/json-member.ts index 63dedf4..0fc879f 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -14,6 +14,8 @@ import { ArrayTypeDescriptor, ensureTypeDescriptor, ensureTypeThunk, + isTypelike, + isTypeThunk, MapTypeDescriptor, MaybeTypeThunk, SetTypeDescriptor, @@ -132,7 +134,7 @@ function jsonMemberDecoratorFactory( const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(property)}`; let typeThunk: TypeThunk | undefined; - if (typeof optionsOrType === 'function' || optionsOrType instanceof TypeDescriptor) { + if (isTypelike(optionsOrType) || isTypeThunk(optionsOrType)) { typeThunk = ensureTypeThunk(optionsOrType, decoratorName); } else { options = optionsOrType; diff --git a/src/type-descriptor.ts b/src/type-descriptor.ts index 0163ddb..28f1ec6 100644 --- a/src/type-descriptor.ts +++ b/src/type-descriptor.ts @@ -132,6 +132,10 @@ export function isTypelike(type: any): type is Typelike { return type != null && (typeof type === 'function' || type instanceof TypeDescriptor); } +export function isTypeThunk(candidate: any): candidate is TypeThunk { + return typeof candidate === 'function' && candidate.name === ''; +} + export function ensureTypeDescriptor(type: Typelike): TypeDescriptor { return type instanceof TypeDescriptor ? type : new ConcreteTypeDescriptor(type); } @@ -144,14 +148,9 @@ export function ensureTypeThunk( throw new Error(`No type given on ${decoratorName}. ${LAZY_TYPE_EXPLANATION}`); } - if (typeThunkOrSerializable instanceof TypeDescriptor) { - return () => typeThunkOrSerializable; - } - - if (typeThunkOrSerializable.name !== '') { - // Function is not anonymous and as such should not be a thunk - return () => typeThunkOrSerializable; + if (isTypeThunk(typeThunkOrSerializable)) { + return typeThunkOrSerializable; } - return typeThunkOrSerializable as TypeThunk; + return () => typeThunkOrSerializable; } From 24ee8ed81d97a840c967b3f4bf8583b72ffa56b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Tue, 2 Feb 2021 15:35:29 +0100 Subject: [PATCH 109/119] 1.7.0-rc2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a5e597..1c1fb9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.7.0-rc1", + "version": "1.7.0-rc2", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 59abc1e0fb65d6b48ce9514d1d46762ee9cb14dd Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 3 Feb 2021 04:21:19 +0100 Subject: [PATCH 110/119] Fix reflected type check for Array/Set/Map The type check could not deal with complex types such as `Array | null`. This example is only a problem with `strictNullChecks` enabled. --- src/json-array-member.ts | 7 +++++-- src/json-map-member.ts | 7 +++++-- src/json-set-member.ts | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/json-array-member.ts b/src/json-array-member.ts index 622a62a..5dfbf1d 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -60,8 +60,11 @@ export function jsonArrayMember( // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been // used on an array. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Array) { + const reflectedType = isReflectMetadataSupported + ? Reflect.getMetadata('design:type', target, propKey) + : null; + + if (reflectedType != null && reflectedType !== Array && reflectedType !== Object) { logError(`${decoratorName}: property is not an Array. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 3ce914a..9cc2cc5 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -47,8 +47,11 @@ export function jsonMapMember( // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used // on a map. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Map) { + const reflectedType = isReflectMetadataSupported + ? Reflect.getMetadata('design:type', target, propKey) + : null; + + if (reflectedType != null && reflectedType !== Map && reflectedType !== Object) { logError(`${decoratorName}: property is not a Map. ${MISSING_REFLECT_CONF_MSG}`); return; } diff --git a/src/json-set-member.ts b/src/json-set-member.ts index d2e02ab..fd85c40 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -42,8 +42,11 @@ export function jsonSetMember(maybeTypeThunk: MaybeTypeThunk, options: IJsonSetM // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used // on a set. Warn if not. - if (isReflectMetadataSupported - && Reflect.getMetadata('design:type', target, propKey) !== Set) { + const reflectedType = isReflectMetadataSupported + ? Reflect.getMetadata('design:type', target, propKey) + : null; + + if (reflectedType != null && reflectedType !== Set && reflectedType !== Object) { logError(`${decoratorName}: property is not a Set. ${MISSING_REFLECT_CONF_MSG}`); return; } From dc4dee8daaedd7c4c6ebc4fac54203469d99dba6 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Wed, 3 Feb 2021 15:17:42 +0000 Subject: [PATCH 111/119] Replace usages of prototype builtins This should improve safety as explained in https://eslint.org/docs/rules/no-prototype-builtins. --- .eslintrc.yaml | 1 - src/json-member.ts | 2 +- src/metadata.ts | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index c65a1e8..20a2fd6 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -73,4 +73,3 @@ overrides: functions: false variables: true typedefs: true - no-prototype-builtins: off # @todo check if this should remain off diff --git a/src/json-member.ts b/src/json-member.ts index 0fc879f..fde7c9b 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -142,7 +142,7 @@ function jsonMemberDecoratorFactory( options = options ?? {}; - if (options.hasOwnProperty('constructor')) { + if (Object.prototype.hasOwnProperty.call(options, 'constructor')) { if (typeThunk !== undefined) { throw new Error( 'Cannot both define constructor option and type. Only one allowed.', diff --git a/src/metadata.ts b/src/metadata.ts index c9f1108..4e9d9c0 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -108,7 +108,7 @@ export class JsonObjectMetadata { } let metadata: JsonObjectMetadata | undefined; - if (prototype.hasOwnProperty(METADATA_FIELD_KEY) === true) { + if (Object.prototype.hasOwnProperty.call(prototype, METADATA_FIELD_KEY)) { // The class prototype contains own jsonObject metadata metadata = prototype[METADATA_FIELD_KEY]; } @@ -128,7 +128,7 @@ export class JsonObjectMetadata { } static ensurePresentInPrototype(prototype: IndexedObject): JsonObjectMetadata { - if (prototype.hasOwnProperty(METADATA_FIELD_KEY)) { + if (Object.prototype.hasOwnProperty.call(prototype, METADATA_FIELD_KEY)) { return prototype[METADATA_FIELD_KEY]; } // Target has no JsonObjectMetadata associated with it yet, create it now. From 4c0330b45fc5a1e4eb85c78120810b34e217fd30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Fri, 5 Feb 2021 01:43:26 +0100 Subject: [PATCH 112/119] 1.7.0-rc3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c1fb9c..408db2a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.7.0-rc2", + "version": "1.7.0-rc3", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 21438450cfab390f2c8ed4ae731b2f3c65f750b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sun, 28 Feb 2021 13:36:17 +0100 Subject: [PATCH 113/119] 1.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 408db2a..4f08f21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.7.0-rc3", + "version": "1.7.0", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 82e69c471b320b35fd8edca479106a51d19c63cd Mon Sep 17 00:00:00 2001 From: Tiancheng Wu Date: Fri, 5 Mar 2021 03:11:05 -0500 Subject: [PATCH 114/119] Update readme.md on parser --- readme.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/readme.md b/readme.md index 472cfe6..f15ede3 100644 --- a/readme.md +++ b/readme.md @@ -67,6 +67,12 @@ const object3 = serializer.parse('{ "prop1": 1, "prop2": "2" }'); object3 instanceof MyDataClass; // true ``` +Note TypedJSON supports parsing arrays and maps at root level as well. Those methods are defined in [parser.ts](https://github.com/JohnWeisz/TypedJSON/blob/master/src/parser.ts). Here is an example showing how to parse a json array: +```typescript +const object4 = serializer.parseAsArray('[{ "prop1": 1, "prop2": "2" }]'); +object4; // [ MyDataClass { prop1: 1, prop2: '2' } ] +``` + ### Mapping types At times, you might find yourself using a custom type such as `Point`, `Decimal`, or `BigInt`. In this case, `TypedJSON.mapType` can be used to define serialization and deserialization functions to prevent the need of repeating on each member. Example: From b9faf17fa7120465dcdb8e10c41b4b1357a37feb Mon Sep 17 00:00:00 2001 From: amoscatelli Date: Sun, 7 Mar 2021 21:06:35 +0100 Subject: [PATCH 115/119] fallback for custom deserializers and serializers (#174) Co-authored-by: Alessandro Moscatelli --- readme.md | 22 ++++++ spec/custom-deserializer.spec.ts | 61 +++++++++++++++++ spec/custom-serializer.spec.ts | 56 +++++++++++++++ spec/lazy-types/custom-deserializer.spec.ts | 61 +++++++++++++++++ spec/lazy-types/custom-serializer.spec.ts | 56 +++++++++++++++ src/deserializer.ts | 12 +++- src/json-array-member.ts | 10 ++- src/json-map-member.ts | 10 ++- src/json-member.ts | 10 ++- src/json-set-member.ts | 10 ++- src/metadata.ts | 12 +++- src/parser.ts | 75 ++++++++++++++------- src/serializer.ts | 11 ++- 13 files changed, 367 insertions(+), 39 deletions(-) diff --git a/readme.md b/readme.md index f15ede3..1f7ae13 100644 --- a/readme.md +++ b/readme.md @@ -237,6 +237,28 @@ class UsingMoment { Note, that with those custom function you get full control over the serialization and deserialization process. This means, you will also receive any undefined (even if a property is not present), and null values. Basically, anything that comes in with an input json. +Custom deserializing and serializing functions can also fall back to the current runtime, so you don't need to create and configure a new one: + +```typescript +function objArrayDeserializer( + json: Array<{prop: string; shouldDeserialize: boolean}>, + params: CustomDeserializerParams, +) { + return json.filter(value => value.shouldDeserialize).map( + value => params.fallback(value, Inner), + ); +} + +@jsonObject +class Obj { + @jsonArrayMember(Inner, {deserializer: objArrayDeserializer}) + inners: Array; + + @jsonMember + str: string; +} +``` + #### Different property name in JSON and class You can provide a name for a property if it differs between a serialized JSON and your class definition. diff --git a/spec/custom-deserializer.spec.ts b/spec/custom-deserializer.spec.ts index 75b8cc3..5aa57db 100644 --- a/spec/custom-deserializer.spec.ts +++ b/spec/custom-deserializer.spec.ts @@ -1,4 +1,5 @@ import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {CustomDeserializerParams} from '../src/metadata'; describe('custom member deserializer', () => { @jsonObject @@ -140,3 +141,63 @@ describe('custom delegating array member serializer', () => { expect(this.obj.inners[0].woo()).toEqual('hoo'); }); }); + +describe('custom delegating array member serializer with fallback', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + woo(): string { + return 'hoo'; + } + } + + function objArrayDeserializer( + json: Array<{prop: string; shouldDeserialize: boolean}>, + params: CustomDeserializerParams, + ) { + return json.filter(value => value.shouldDeserialize).map( + value => params.fallback(value, Inner), + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(Inner, {deserializer: objArrayDeserializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = TypedJSON.parse( + JSON.stringify({ + inners: [ + { + prop: 'something', + shouldDeserialize: false, + }, + { + prop: 'gogo', + shouldDeserialize: true, + }, + ], + str: 'Text', + }), + Obj, + ); + }); + + it('should properly serialize', function () { + expect(this.obj).toBeDefined(); + expect(this.obj instanceof Obj).toBeTruthy(); + expect(this.obj.str).toEqual('Text'); + expect(this.obj.inners.length).toEqual(1); + expect(this.obj.inners[0] instanceof Inner).toBeTruthy(); + expect(this.obj.inners[0]).not.toHaveProperties(['shouldDeserialize']); + expect(this.obj.inners[0]).toHaveProperties({prop: 'gogo'}); + expect(this.obj.inners[0].woo()).toEqual('hoo'); + }); +}); diff --git a/spec/custom-serializer.spec.ts b/spec/custom-serializer.spec.ts index e349e93..e07279d 100644 --- a/spec/custom-serializer.spec.ts +++ b/spec/custom-serializer.spec.ts @@ -1,4 +1,5 @@ import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../src'; +import {CustomSerializerParams} from '../src/metadata'; describe('custom member serializer', () => { @jsonObject @@ -127,3 +128,58 @@ describe('custom delegating array member serializer', () => { ); }); }); + +describe('custom delegating array member serializer with fallback', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + shouldSerialize: boolean; + + constructor(); + constructor(prop: string, shouldSerialize: boolean); + constructor(prop?: string, shouldSerialize?: boolean) { + this.prop = prop; + this.shouldSerialize = shouldSerialize; + } + } + + function objArraySerializer(value: Array, params: CustomSerializerParams) { + return value.filter(inner => inner.shouldSerialize).map( + inner => params.fallback(inner, Inner), + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(Inner, {serializer: objArraySerializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = new Obj(); + this.obj.inners = [ + new Inner('valval', false), + new Inner('something', true), + ]; + this.obj.str = 'Text'; + this.json = JSON.parse(TypedJSON.stringify(this.obj, Obj)); + }); + + it('should properly serialize', function () { + expect(this.json).toEqual( + { + inners: [ + { + prop: 'something', + }, + ], + str: 'Text', + }, + ); + }); +}); diff --git a/spec/lazy-types/custom-deserializer.spec.ts b/spec/lazy-types/custom-deserializer.spec.ts index a9310ba..e0f568d 100644 --- a/spec/lazy-types/custom-deserializer.spec.ts +++ b/spec/lazy-types/custom-deserializer.spec.ts @@ -1,4 +1,5 @@ import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {CustomDeserializerParams} from '../../src/metadata'; describe('lazy, custom array member deserializer', () => { @jsonObject @@ -102,3 +103,63 @@ describe('lazy, custom delegating array member serializer', () => { expect(this.obj.inners[0].woo()).toEqual('hoo'); }); }); + +describe('lazy, custom delegating array member serializer with fallback', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + woo(): string { + return 'hoo'; + } + } + + function objArrayDeserializer( + json: Array<{prop: string; shouldDeserialize: boolean}>, + params: CustomDeserializerParams, + ) { + return json.filter(value => value.shouldDeserialize).map( + value => params.fallback(value, Inner), + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(() => Inner, {deserializer: objArrayDeserializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = TypedJSON.parse( + JSON.stringify({ + inners: [ + { + prop: 'something', + shouldDeserialize: false, + }, + { + prop: 'gogo', + shouldDeserialize: true, + }, + ], + str: 'Text', + }), + Obj, + ); + }); + + it('should properly serialize', function () { + expect(this.obj).toBeDefined(); + expect(this.obj instanceof Obj).toBeTruthy(); + expect(this.obj.str).toEqual('Text'); + expect(this.obj.inners.length).toEqual(1); + expect(this.obj.inners[0] instanceof Inner).toBeTruthy(); + expect(this.obj.inners[0]).not.toHaveProperties(['shouldDeserialize']); + expect(this.obj.inners[0]).toHaveProperties({prop: 'gogo'}); + expect(this.obj.inners[0].woo()).toEqual('hoo'); + }); +}); diff --git a/spec/lazy-types/custom-serializer.spec.ts b/spec/lazy-types/custom-serializer.spec.ts index 0b79a79..74b8648 100644 --- a/spec/lazy-types/custom-serializer.spec.ts +++ b/spec/lazy-types/custom-serializer.spec.ts @@ -1,4 +1,5 @@ import {jsonArrayMember, jsonMember, jsonObject, TypedJSON} from '../../src'; +import {CustomSerializerParams} from '../../src/metadata'; describe('lazy, custom array member serializer', () => { @jsonObject @@ -91,3 +92,58 @@ describe('lazy, custom delegating array member serializer', () => { ); }); }); + +describe('lazy, custom delegating array member serializer with fallback', () => { + @jsonObject + class Inner { + @jsonMember + prop: string; + + shouldSerialize: boolean; + + constructor(); + constructor(prop: string, shouldSerialize: boolean); + constructor(prop?: string, shouldSerialize?: boolean) { + this.prop = prop; + this.shouldSerialize = shouldSerialize; + } + } + + function objArraySerializer(value: Array, params: CustomSerializerParams) { + return value.filter(inner => inner.shouldSerialize).map( + inner => params.fallback(inner, Inner), + ); + } + + @jsonObject + class Obj { + @jsonArrayMember(() => Inner, {serializer: objArraySerializer}) + inners: Array; + + @jsonMember + str: string; + } + + beforeAll(function () { + this.obj = new Obj(); + this.obj.inners = [ + new Inner('valval', false), + new Inner('something', true), + ]; + this.obj.str = 'Text'; + this.json = JSON.parse(TypedJSON.stringify(this.obj, Obj)); + }); + + it('should properly serialize', function () { + expect(this.json).toEqual( + { + inners: [ + { + prop: 'something', + }, + ], + str: 'Text', + }, + ); + }); +}); diff --git a/src/deserializer.ts b/src/deserializer.ts index d3fb9b9..68d6000 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -5,6 +5,7 @@ import { AnyT, ArrayTypeDescriptor, ConcreteTypeDescriptor, + ensureTypeDescriptor, MapShape, MapTypeDescriptor, SetTypeDescriptor, @@ -297,7 +298,16 @@ function convertAsObject( let revivedValue; if (objMemberMetadata.deserializer != null) { - revivedValue = objMemberMetadata.deserializer(objMemberValue); + revivedValue = objMemberMetadata.deserializer( + objMemberValue, + { + fallback: (so, td) => deserializer.convertSingleValue( + so, + ensureTypeDescriptor(td), + knownTypes, + ), + }, + ); } else if (objMemberMetadata.type == null) { throw new TypeError( `Cannot deserialize ${objMemberDebugName} there is` diff --git a/src/json-array-member.ts b/src/json-array-member.ts index 5dfbf1d..f70173d 100644 --- a/src/json-array-member.ts +++ b/src/json-array-member.ts @@ -1,5 +1,9 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; -import {injectMetadataInformation} from './metadata'; +import { + CustomDeserializerParams, + CustomSerializerParams, + injectMetadataInformation, +} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, @@ -31,10 +35,10 @@ export interface IJsonArrayMemberOptions extends OptionsBase { * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: ((json: any) => any) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; + serializer?: ((value: any, params: CustomSerializerParams) => any) | null; } /** diff --git a/src/json-map-member.ts b/src/json-map-member.ts index 9cc2cc5..ec20658 100644 --- a/src/json-map-member.ts +++ b/src/json-map-member.ts @@ -1,5 +1,9 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; -import {injectMetadataInformation} from './metadata'; +import { + CustomDeserializerParams, + CustomSerializerParams, + injectMetadataInformation, +} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; import {ensureTypeThunk, MapOptions, MapT, MaybeTypeThunk} from './type-descriptor'; @@ -21,10 +25,10 @@ export interface IJsonMapMemberOptions extends OptionsBase, Partial * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: ((json: any) => any) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; + serializer?: ((value: any, params: CustomSerializerParams) => any) | null; } /** diff --git a/src/json-member.ts b/src/json-member.ts index fde7c9b..52d8b82 100644 --- a/src/json-member.ts +++ b/src/json-member.ts @@ -8,7 +8,11 @@ import { MISSING_REFLECT_CONF_MSG, nameof, } from './helpers'; -import {injectMetadataInformation} from './metadata'; +import { + CustomDeserializerParams, + CustomSerializerParams, + injectMetadataInformation, +} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; import { ArrayTypeDescriptor, @@ -49,10 +53,10 @@ export interface IJsonMemberOptions extends OptionsBase { * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: ((json: any) => any) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; + serializer?: ((value: any, params: CustomSerializerParams) => any) | null; } /** diff --git a/src/json-set-member.ts b/src/json-set-member.ts index fd85c40..fc4201c 100644 --- a/src/json-set-member.ts +++ b/src/json-set-member.ts @@ -1,5 +1,9 @@ import {isReflectMetadataSupported, logError, MISSING_REFLECT_CONF_MSG, nameof} from './helpers'; -import {injectMetadataInformation} from './metadata'; +import { + CustomDeserializerParams, + CustomSerializerParams, + injectMetadataInformation, +} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; import {ensureTypeThunk, MaybeTypeThunk, SetT} from './type-descriptor'; @@ -21,10 +25,10 @@ export interface IJsonSetMemberOptions extends OptionsBase { * When set, this deserializer will be used to deserialize the member. The callee must assure * the correct type. */ - deserializer?: ((json: any) => any) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => any) | null; /** When set, this serializer will be used to serialize the member. */ - serializer?: ((value: any) => any) | null; + serializer?: ((value: any, params: CustomSerializerParams) => any) | null; } /** diff --git a/src/metadata.ts b/src/metadata.ts index 4e9d9c0..e97996b 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -5,6 +5,14 @@ import {IndexedObject, Serializable} from './types'; export const METADATA_FIELD_KEY = '__typedJsonJsonObjectMetadataInformation__'; +export interface CustomDeserializerParams { + fallback: (sourceObject: any, constructor: Serializable | TypeDescriptor) => any; +} + +export interface CustomSerializerParams { + fallback: (sourceObject: any, constructor: Serializable | TypeDescriptor) => any; +} + export type TypeResolver = ( sourceObject: IndexedObject, knownTypes: Map, @@ -36,10 +44,10 @@ export interface JsonMemberMetadata { options?: OptionsBase | null; /** Custom deserializer to use. */ - deserializer?: ((json: any) => any) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => any) | null; /** Custom serializer to use. */ - serializer?: ((value: any) => any) | null; + serializer?: ((value: any, params: CustomSerializerParams) => any) | null; } export class JsonObjectMetadata { diff --git a/src/parser.ts b/src/parser.ts index 010c2cd..6431f79 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,7 +1,13 @@ import {defaultTypeResolver, Deserializer} from './deserializer'; import {logError, logWarning, nameof, parseToJSObject} from './helpers'; import {createArrayType} from './json-array-member'; -import {JsonObjectMetadata, TypeHintEmitter, TypeResolver} from './metadata'; +import { + CustomDeserializerParams, + CustomSerializerParams, + JsonObjectMetadata, + TypeHintEmitter, + TypeResolver, +} from './metadata'; import {extractOptionBase, OptionsBase} from './options-base'; import {defaultTypeEmitter, Serializer} from './serializer'; import {ensureTypeDescriptor, MapT, SetT} from './type-descriptor'; @@ -15,12 +21,12 @@ export interface MappedTypeConverters { /** * Use this deserializer to convert a JSON value to the type. */ - deserializer?: ((json: any) => T | null | undefined) | null; + deserializer?: ((json: any, params: CustomDeserializerParams) => T | null | undefined) | null; /** * Use this serializer to convert a type back to JSON. */ - serializer?: ((value: T | null | undefined) => any) | null; + serializer?: ((value: T | null | undefined, params: CustomSerializerParams) => any) | null; } export interface ITypedJSONSettings extends OptionsBase { @@ -399,26 +405,13 @@ export class TypedJSON { parse(object: any): T | undefined { const json = parseToJSObject(object, this.rootConstructor); - const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor); let result: T | undefined; - const knownTypes = new Map(); - - this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => { - knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - - if (rootMetadata !== undefined) { - rootMetadata.processDeferredKnownTypes(); - rootMetadata.knownTypes.forEach(knownTypeCtor => { - knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); - }); - } try { result = this.deserializer.convertSingleValue( json, ensureTypeDescriptor(this.rootConstructor), - knownTypes, + this.getKnownTypes(), ) as T; } catch (e) { this.errorHandler(e); @@ -552,6 +545,23 @@ export class TypedJSON { return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent); } + private getKnownTypes(): Map { + const rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor); + const knownTypes = new Map(); + + this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor => { + knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); + }); + + if (rootMetadata !== undefined) { + rootMetadata.processDeferredKnownTypes(); + rootMetadata.knownTypes.forEach(knownTypeCtor => { + knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor); + }); + } + return knownTypes; + } + private _mapKnownTypes(constructors: Array>) { const map = new Map>(); @@ -565,15 +575,34 @@ export class TypedJSON { converters: MappedTypeConverters, ): void { if (converters.deserializer != null) { - this.deserializer.setDeserializationStrategy(type, (value) => { - return converters.deserializer!(value); - }); + this.deserializer.setDeserializationStrategy( + type, + value => converters.deserializer!( + value, + { + fallback: (so, td) => this.deserializer.convertSingleValue( + so, + ensureTypeDescriptor(td), + this.getKnownTypes(), + ), + }, + ), + ); } if (converters.serializer != null) { - this.serializer.setSerializationStrategy(type, (value) => { - return converters.serializer!(value); - }); + this.serializer.setSerializationStrategy( + type, + value => converters.serializer!( + value, + { + fallback: (so, td) => this.serializer.convertSingleValue( + so, + ensureTypeDescriptor(td), + ), + }, + ), + ); } } } diff --git a/src/serializer.ts b/src/serializer.ts index ff8ca5b..c3dfeae 100644 --- a/src/serializer.ts +++ b/src/serializer.ts @@ -11,6 +11,7 @@ import { AnyT, ArrayTypeDescriptor, ConcreteTypeDescriptor, + ensureTypeDescriptor, MapShape, MapTypeDescriptor, SetTypeDescriptor, @@ -241,7 +242,15 @@ function convertAsObject( const objMemberOptions = mergeOptions(classOptions, objMemberMetadata.options); let serialized; if (objMemberMetadata.serializer != null) { - serialized = objMemberMetadata.serializer(sourceObject[objMemberMetadata.key]); + serialized = objMemberMetadata.serializer( + sourceObject[objMemberMetadata.key], + { + fallback: (so, td) => serializer.convertSingleValue( + so, + ensureTypeDescriptor(td), + ), + }, + ); } else if (objMemberMetadata.type == null) { throw new TypeError( `Could not serialize ${objMemberMetadata.name}, there is` From fd436e1d221fd16f45117b1739678e3d7a7e73b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Sun, 7 Mar 2021 21:09:18 +0100 Subject: [PATCH 116/119] 1.8.0-rc1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f08f21..76f0aa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.7.0", + "version": "1.8.0-rc1", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js", From 698bb39dde083ac9205368a169e7bd26c3fefcac Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Mon, 11 Oct 2021 10:22:33 +0200 Subject: [PATCH 117/119] Export MapShape enum --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index a4111d1..6899a55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,6 +25,7 @@ export { MapT, Typelike, MapOptions, + MapShape, SetTypeDescriptor, ArrayTypeDescriptor, MapTypeDescriptor, From 210b9fa2f644879e58a67c5bbb3610f5d90427be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Wed, 13 Oct 2021 11:34:19 +0200 Subject: [PATCH 118/119] Run yarn upgrade --- yarn.lock | 3681 +++++++++++++++++++++++------------------------------ 1 file changed, 1617 insertions(+), 2064 deletions(-) diff --git a/yarn.lock b/yarn.lock index 742d570..8b9e612 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,190 +2,241 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + "@babel/core@^7.7.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d" - integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.6.1" + semver "^6.3.0" + source-map "^0.5.0" -"@babel/generator@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82" - integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g== +"@babel/generator@^7.15.4", "@babel/generator@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== dependencies: - "@babel/types" "^7.11.5" + "@babel/types" "^7.15.6" jsesc "^2.5.1" - source-map "^0.6.1" + source-map "^0.5.0" + +"@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" - integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== - -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" +"@babel/parser@^7.15.4", "@babel/parser@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== +"@babel/types@^7.15.4", "@babel/types@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@eslint/eslintrc@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.0.tgz#3d1f19fb797d42fb1c85458c1c73541eeb1d9e76" - integrity sha512-bfL5365QSCmH6cPeFT7Ywclj8C7LiF7sO6mUGzZhtAMV7iID1Euq6740u/SRi4C80NOnVz/CEfK8/HO+nCAPJg== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -205,23 +256,23 @@ "@istanbuljs/schema" "^0.1.2" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@matthiaskunnen/eslint-config-base@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-base/-/eslint-config-base-1.2.0.tgz#4e6852af919c4bf7514b1c8586e04ed0f5cd0089" - integrity sha512-vUfDXwuRKi4sQ9H1vt77ekfC9usswHmuJ3G+DzS8jOnbpQFJe7CGmRDxvOAotREVSoC39FlNbG8m56c/yw/Z5w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-base/-/eslint-config-base-1.2.1.tgz#b466d2fe5582435a30c3c89a0569fe152370c5d8" + integrity sha512-oTYX/Q6H5227RH0ehWTcSERs46Dx6W/9L8V4hMlhRR2fLeiCFhcxTazNlU9LJ+oYH7gKBvDy6EPq0JPKusGA9w== dependencies: eslint "^7.5.0" eslint-plugin-import "^2.20.2" eslint-plugin-unicorn "^19.0.1" "@matthiaskunnen/eslint-config-typescript@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-typescript/-/eslint-config-typescript-1.3.0.tgz#cde52073a1a7fbebcfd6e00f9b5080084c0a76fe" - integrity sha512-vR8bZwQCGGNyKsidfQla6mYlcAWPL5MV27IFC+U0ttd3gdyEqnh3/nRIn42VZdQSrRryAux+qbkybhGyeO9Znw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/@matthiaskunnen/eslint-config-typescript/-/eslint-config-typescript-1.4.1.tgz#1f0ed5aa4e716ea1733464af1370d001253caf9c" + integrity sha512-6Sp2GG5vYBrJv35E1Ez2WXIhdHBzTaOY4eHTm8aeg4eYGydEjSxPTVR3WFsh6SG4Mr2SW7TtOyiyKqUp7n9ZNw== dependencies: "@matthiaskunnen/eslint-config-base" "^1.1.0" "@typescript-eslint/eslint-plugin" "^2.31.0" @@ -229,76 +280,68 @@ "@typescript-eslint/parser" "^2.31.0" tslint "^6.1.2" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@size-limit/file@4.5.7": - version "4.5.7" - resolved "https://registry.yarnpkg.com/@size-limit/file/-/file-4.5.7.tgz#29ce728aa83e3d7ee48421a32894cdf4954405ca" - integrity sha512-OCbJsYMELJORRSX386rPWUKoXvF4XNBFZob3amDl/2y1ox7DKdh1hinAWYndJdpZaFRI6rHoR+AXQ9dvWe9Ofg== +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@size-limit/file@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@size-limit/file/-/file-4.12.0.tgz#50166eca7b9b5aa15f51a72b3d9d31e2d8530e6f" + integrity sha512-csgGSAG3s2y9eOl/taahojXY91AXpNgqLs9HJ5c/Qmrs+6UHgXbwJ4vo475NfZmt1Y9simircb1ygqupauNUyA== dependencies: - semver "7.3.2" + semver "7.3.5" "@size-limit/preset-small-lib@^4.5.7": - version "4.5.7" - resolved "https://registry.yarnpkg.com/@size-limit/preset-small-lib/-/preset-small-lib-4.5.7.tgz#db903c7a446eaa932e92d502c3b4e7a18ca3a335" - integrity sha512-8aRxacxXLeCzvGmAA62F0baRcaKlwDmxR/cofCQFGCtVBC3f9O2Tlk1/K5qu9bqTcCI1nnCA3WFVkQae4irACA== + version "4.12.0" + resolved "https://registry.yarnpkg.com/@size-limit/preset-small-lib/-/preset-small-lib-4.12.0.tgz#0f7eb6ca7b7e6acb87b17bf6f7d9000946423cfc" + integrity sha512-jqUT2PiPN4Bf9aeUcTHt78+mELwo1x3K+w4grfNkzV/46j1rK3eXarls4qc0/FHolE76cLgNTLNjrX/Zb9c65w== dependencies: - "@size-limit/file" "4.5.7" - "@size-limit/webpack" "4.5.7" + "@size-limit/file" "4.12.0" + "@size-limit/webpack" "4.12.0" -"@size-limit/webpack@4.5.7": - version "4.5.7" - resolved "https://registry.yarnpkg.com/@size-limit/webpack/-/webpack-4.5.7.tgz#3b1210a486ff1c2b31e6adaa7c8f1e56711b17ba" - integrity sha512-S7dg4YR26y431+jWw0TPm6PEuWP5Lh8GFlfmY7smOaZFHvXfpSYhtK/d699/RgxegBDV7UCSj19ZE9RgE3a/Pg== +"@size-limit/webpack@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@size-limit/webpack/-/webpack-4.12.0.tgz#65076310bbe4f043fad0a3af2bea0423573ff7ae" + integrity sha512-CtqSqxffexYmuAKeKAT2xcDmLwGChHXeq8Y9gjIe9vxfzUx1HU7Nmc0XyvsLGZG1qZO4TFuANlfQeavGY0jB6A== dependencies: - css-loader "^4.2.1" + css-loader "^5.2.6" escape-string-regexp "^4.0.0" - file-loader "^6.0.0" + file-loader "^6.2.0" mkdirp "^1.0.4" - nanoid "^3.1.10" - optimize-css-assets-webpack-plugin "^5.0.3" + nanoid "^3.1.23" + optimize-css-assets-webpack-plugin "^6.0.0" pnp-webpack-plugin "^1.6.4" rimraf "^3.0.2" - style-loader "^1.2.1" + style-loader "^2.0.0" webpack "^4.44.1" - webpack-bundle-analyzer "^3.8.0" + webpack-bundle-analyzer "^4.4.2" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" @@ -306,14 +349,14 @@ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/jasmine@^3.5.3": - version "3.5.14" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.14.tgz#f41a14e8ffa939062a71cf9722e5ee7d4e1f94af" - integrity sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w== + version "3.9.1" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.9.1.tgz#94c65ee8bf9d24d9e1d84abaed57b6e0da8b49de" + integrity sha512-PVpjh8S8lqKFKurWSKdFATlfBHGPzgy0PoDdzQ+rr78jTQ0aacyh9YndzZcAUPxhk4kRujItFFGQdUJ7flHumw== -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" @@ -321,20 +364,15 @@ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== - "@typescript-eslint/eslint-plugin-tslint@^2.31.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz#0a2cea8e9a0726ae5a42cecd94095b41b749a8e7" @@ -541,33 +579,30 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.1.1, acorn@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== aggregate-error@^3.0.0: version "3.1.0" @@ -587,17 +622,27 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.0: +ajv@^8.0.1: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= @@ -608,23 +653,18 @@ ansi-colors@^4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + type-fest "^0.21.3" -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -632,11 +672,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@^2.0.0: @@ -647,10 +686,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -699,19 +738,16 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" @@ -723,13 +759,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.0" asn1.js@^5.2.0: version "5.4.1" @@ -754,11 +791,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -769,25 +801,20 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -802,16 +829,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bfj@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" - integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== - dependencies: - bluebird "^3.5.5" - check-types "^8.0.3" - hoopy "^0.1.4" - tryer "^1.0.1" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -823,9 +840,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" @@ -834,38 +851,31 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== - -bn.js@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== - -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -boolbase@^1.0.0, boolbase@~1.0.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -901,7 +911,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -938,11 +948,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -967,20 +977,21 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" - integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== +browserslist@^4.0.0, browserslist@^4.16.0, browserslist@^4.16.6: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== dependencies: - caniuse-lite "^1.0.30001111" - electron-to-chromium "^1.3.523" - escalade "^3.0.2" - node-releases "^1.1.60" + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" + escalade "^3.1.1" + node-releases "^1.1.77" + picocolors "^0.2.1" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" @@ -996,6 +1007,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1006,10 +1025,10 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -bytes@3.1.0, bytes@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes-iec@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes-iec/-/bytes-iec-3.1.1.tgz#94cd36bf95c2c22a82002c247df8772d1d591083" + integrity sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA== cacache@^12.0.2: version "12.0.4" @@ -1057,29 +1076,13 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" @@ -1091,11 +1094,6 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== - caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -1106,12 +1104,12 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001111: - version "1.0.30001122" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001122.tgz#2c8ff631330d986a07a7ba7125cce77a1373b475" - integrity sha512-pxjw28CThdrqfz06nJkpAc5SXM404TXB/h5f4UJX+rrXJKE/1bu/KAILc2AY+O6cQIFtRjV9qOR2vaEp9LDGUA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1121,18 +1119,13 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: supports-color "^5.3.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -check-types@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" - integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -1152,20 +1145,20 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.1, chokidar@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@^3.4.1, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" chownr@^1.1.1: version "1.1.4" @@ -1173,11 +1166,9 @@ chownr@^1.1.1: integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" @@ -1226,10 +1217,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" - integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-truncate@^2.1.0: version "2.1.0" @@ -1253,15 +1244,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1270,7 +1252,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1289,41 +1271,35 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" +colord@^2.0.1, colord@^2.6: + version "2.8.0" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.8.0.tgz#64fb7aa03de7652b5a39eee50271a104c2783b12" + integrity sha512-kNkVV4KFta3TYQv0bzs4xNwLaeag261pxgzGQSh4cQ1rEhYjcTJfFRP0SDlbhLONg0eSoLzrDd79PosjbltufA== -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.2, colorette@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -commander@^2.12.1, commander@^2.18.0, commander@^2.20.0: +commander@^2.12.1, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" - integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commondir@^1.0.1: version "1.0.1" @@ -1365,40 +1341,13 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -1417,35 +1366,14 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -1521,172 +1449,146 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= +css-color-names@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" + integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== +css-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== dependencies: - postcss "^7.0.1" timsort "^0.3.0" -css-loader@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.2.tgz#b668b3488d566dc22ebcf9425c5f254a05808c89" - integrity sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg== +css-loader@^5.2.6: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== dependencies: - camelcase "^6.0.0" - cssesc "^3.0.0" - icss-utils "^4.1.1" + icss-utils "^5.1.0" loader-utils "^2.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.3" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^7.3.2" + schema-utils "^3.0.0" + semver "^7.3.5" -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== dependencies: boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: - mdn-data "2.0.6" + mdn-data "2.0.14" source-map "^0.6.1" -css-what@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" - integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +cssnano-preset-default@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz#359943bf00c5c8e05489f12dd25f3006f2c1cbd2" + integrity sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.0" + postcss-convert-values "^5.0.1" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.2" + postcss-merge-rules "^5.0.2" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.2" + postcss-minify-params "^5.0.1" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.2" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.1" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.2" + postcss-unique-selectors "^5.0.1" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== +cssnano@^5.0.2: + version "5.0.8" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.8.tgz#39ad166256980fcc64faa08c9bb18bb5789ecfa9" + integrity sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg== dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" + cssnano-preset-default "^5.1.4" + is-resolvable "^1.1.0" + lilconfig "^2.0.3" + yaml "^1.10.2" -csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.1.2" cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1703,9 +1605,9 @@ dedent@^0.7.0: integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: version "3.0.0" @@ -1721,7 +1623,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1750,11 +1652,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -1763,11 +1660,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -1789,13 +1681,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -1804,12 +1695,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: domelementtype "^2.0.1" + domhandler "^4.2.0" entities "^2.0.0" domain-browser@^1.1.1: @@ -1817,32 +1709,28 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== dependencies: - dom-serializer "0" - domelementtype "1" + domelementtype "^2.2.0" -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== +domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: - is-obj "^2.0.0" + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" -duplexer@^0.1.1: +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -1857,38 +1745,23 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -electron-to-chromium@^1.3.523: - version "1.3.556" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.556.tgz#d2a8fed6b93051c5c27d182c43c7bc4d88b77afb" - integrity sha512-g5cGpg6rOCXxyfaLCQIWz9Fx+raFfbZ6sc4QLfvvaiCERBzY6YD6rh5d12QN++bEF1Tm9osYnxP37lbN/92j4A== +electron-to-chromium@^1.3.857: + version "1.3.867" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz#7cb484db4b57c28da0b65c51e434c3a1f3f9aa0d" + integrity sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw== elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^8.0.0: version "8.0.0" @@ -1900,11 +1773,6 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1912,10 +1780,10 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -1929,40 +1797,49 @@ enquirer@^2.3.5, enquirer@^2.3.6: ansi-colors "^4.1.1" entities@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -1978,15 +1855,10 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escalade@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" - integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" @@ -2006,45 +1878,46 @@ eslint-ast-utils@^1.1.0: lodash.get "^4.4.2" lodash.zip "^4.2.0" -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.0.tgz#9e97c12688113401259b39d960e6a1f09f966435" + integrity sha512-hqSE88MmHl3ru9SYvDyGrlo0JwROlf9fiEMplEV7j/EAuq9iSlIlyCFbBT6pdULQBSnBYtYKiMLps+hKkyP7Gg== dependencies: - debug "^2.6.9" + debug "^3.2.7" + find-up "^2.1.0" pkg-dir "^2.0.0" eslint-plugin-import@^2.20.2: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== + version "2.25.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9" + integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.0" has "^1.0.3" + is-core-module "^2.7.0" + is-glob "^4.0.3" minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" + object.values "^1.1.5" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" eslint-plugin-jasmine@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.1.tgz#afdf8ca6a91e85041d9e0fb650af446874bf8852" - integrity sha512-uS7kvt7RPUB/gLDwhJ/Ax0APrmkj7In8VJWkiZLYHafz2Ix74mMRJx82YZZ3zHRa/YOuTL+ig6dW/aKwdNzUuw== + version "4.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.2.tgz#50cc20d603b02b37727f8d174d4b83b9b8ef25a5" + integrity sha512-Jr52EBi6Ql5WVDvRCKBID9kRD6/CaObvCWmgHpqobczX2Mzt8/QMu9vpgx6q/O5jyQ9CIGrKaEbPuEfHRf8guw== eslint-plugin-unicorn@^19.0.1: version "19.0.1" @@ -2072,12 +1945,12 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0, eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" eslint-template-visitor@^1.1.0: @@ -2101,29 +1974,37 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + eslint@^7.5.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.0.tgz#9a3e2e6e4d0a3f8c42686073c25ebf2e91443e8a" - integrity sha512-qgtVyLZqKd2ZXWnLQA4NtVbOyH56zivOAdBFWE54RFkSZjokzNrcP4Z0eVWsZ+84ByXv+jL9k/wE1ENYe8xRFw== + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.3.0" - esquery "^1.2.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -2131,7 +2012,7 @@ eslint@^7.5.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2140,7 +2021,7 @@ eslint@^7.5.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -2153,13 +2034,13 @@ espree@^6.1.1: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" - acorn-jsx "^5.2.0" + acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" esprima@^4.0.0: @@ -2167,14 +2048,14 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -2196,15 +2077,10 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -2214,10 +2090,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" - integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== +execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -2242,42 +2118,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@^4.16.3: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2307,34 +2147,21 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -2347,9 +2174,9 @@ fast-levenshtein@^2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -2358,38 +2185,26 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" -file-loader@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" - integrity sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg== +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" - schema-utils "^2.7.1" + schema-utils "^3.0.0" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -2407,19 +2222,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -2430,15 +2232,15 @@ find-cache-dir@^2.1.0: pkg-dir "^3.0.0" find-cache-dir@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -2460,26 +2262,33 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-versions@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - semver-regex "^2.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-versions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + semver-regex "^3.1.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== flush-write-stream@^1.0.0: version "1.1.1" @@ -2502,11 +2311,6 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2514,11 +2318,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -2528,9 +2327,9 @@ from2@^2.1.0: readable-stream "^2.0.0" fromentries@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" - integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -2555,10 +2354,10 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -2570,16 +2369,25 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -2597,6 +2405,14 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -2610,22 +2426,17 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2639,17 +2450,17 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -2659,17 +2470,21 @@ globby@^11.0.1: slash "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -gzip-size@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: - duplexer "^0.1.1" - pify "^4.0.1" + duplexer "^0.1.2" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" @@ -2681,10 +2496,17 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" has-value@^0.3.1: version "0.3.1" @@ -2717,7 +2539,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -2742,19 +2564,14 @@ hash.js@^1.0.0, hash.js@^1.0.3: minimalistic-assert "^1.0.1" hasha@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" - integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" type-fest "^0.8.0" -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -2763,58 +2580,16 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -2826,39 +2601,30 @@ human-signals@^1.1.1: integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== husky@^4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" - integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== + version "4.3.8" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" + integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" - cosmiconfig "^6.0.0" - find-versions "^3.2.0" + cosmiconfig "^7.0.0" + find-versions "^4.0.0" opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" + pkg-dir "^5.0.0" please-upgrade-node "^3.2.0" slash "^3.0.0" which-pm-runs "^1.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" @@ -2875,26 +2641,18 @@ ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" - integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" + integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== imurmurhash@^0.1.4: version "0.1.4" @@ -2906,11 +2664,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -2924,7 +2677,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2939,15 +2692,19 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -2968,10 +2725,12 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" @@ -2987,27 +2746,30 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= +is-core-module@^2.2.0, is-core-module@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" + has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" @@ -3024,9 +2786,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" @@ -3046,11 +2810,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -3068,11 +2827,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3085,10 +2839,10 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -3097,6 +2851,18 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3114,11 +2880,6 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3126,52 +2887,65 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has-symbols "^1.0.1" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-resolvable@^1.0.0: +is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - html-comment-regex "^1.1.0" + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3205,9 +2979,9 @@ isobject@^3.0.0, isobject@^3.0.1: integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz#36786d4d82aad2ea5911007e255e2da6b5f80d86" + integrity sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g== istanbul-lib-hook@^3.0.0: version "3.0.0" @@ -3249,34 +3023,34 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.4.tgz#5c38ce8136edf484c0fcfbf7514aafb0363ed1db" + integrity sha512-bFjUnc95rHjdCR63WMHUS7yfJJh8T9IPSWavvR02hhjVwezWALZ5axF9EqjmwZHpXqkzbgAMP8DmAtiyNxrdrQ== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jasmine-core@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" - integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== +jasmine-core@~3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.9.0.tgz#09a3c8169fe98ec69440476d04a0e4cb4d59e452" + integrity sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ== jasmine@^3.5.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.6.1.tgz#a20456b309a669b547a3c24bb2120f16f70cfc65" - integrity sha512-Jqp8P6ZWkTVFGmJwBK46p+kJNrZCdqkQ4GL+PGuBXZwK1fM4ST9BizkYgIwCFqYYqnTizAy6+XG2Ej5dFrej9Q== + version "3.9.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.9.0.tgz#286c4f9f88b69defc24acf3989af5533d5c6a0e6" + integrity sha512-JgtzteG7xnqZZ51fg7N2/wiQmXon09szkALcRMTgCMX4u/m17gVJFjObnvw5FXkZOWuweHPaPRVB6DI2uN0wVA== dependencies: - fast-glob "^2.2.6" - jasmine-core "~3.6.0" + glob "^7.1.6" + jasmine-core "~3.9.0" js-tokens@^4.0.0: version "4.0.0" @@ -3284,9 +3058,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3302,15 +3076,20 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz#371873c5ffa44304a6ba12419bcfa95f404ae081" - integrity sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q== + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -3324,9 +3103,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -3370,25 +3149,30 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lilconfig@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" + integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= lint-staged@^10.2.13: - version "10.2.13" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.13.tgz#b9c504683470edfc464b7d3fe3845a5a1efcd814" - integrity sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA== + version "10.5.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" - commander "^6.0.0" + commander "^6.2.0" cosmiconfig "^7.0.0" - debug "^4.1.1" + debug "^4.2.0" dedent "^0.7.0" enquirer "^2.3.6" - execa "^4.0.3" - listr2 "^2.6.0" + execa "^4.1.0" + listr2 "^3.2.2" log-symbols "^4.0.0" micromatch "^4.0.2" normalize-path "^3.0.0" @@ -3396,29 +3180,18 @@ lint-staged@^10.2.13: string-argv "0.3.1" stringify-object "^3.3.0" -listr2@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.6.2.tgz#4912eb01e1e2dd72ec37f3895a56bf2622d6f36a" - integrity sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA== +listr2@^3.2.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.12.2.tgz#2d55cc627111603ad4768a9e87c9c7bb9b49997e" + integrity sha512-64xC2CJ/As/xgVI3wbhlPWVPx0wfTqbUAkpb7bjDi0thSWMqrf07UFhrfsGoo8YSXmF049Rp9C0cjLC8rZxK9A== dependencies: - chalk "^4.1.0" cli-truncate "^2.1.0" - figures "^3.2.0" - indent-string "^4.0.0" + colorette "^1.4.0" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.2" + rxjs "^6.6.7" through "^2.3.8" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" + wrap-ansi "^7.0.0" load-json-file@^4.0.0: version "4.0.0" @@ -3476,6 +3249,18 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -3491,6 +3276,16 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -3501,17 +3296,18 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== +log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - chalk "^4.0.0" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" log-update@^4.0.0: version "4.0.0" @@ -3530,6 +3326,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -3571,20 +3374,10 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== memory-fs@^0.4.1: version "0.4.1" @@ -3607,26 +3400,16 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3646,13 +3429,13 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -3662,22 +3445,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.3.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== mimic-fn@^2.1.0: version "2.1.0" @@ -3689,7 +3460,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -3730,7 +3501,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -3759,35 +3530,35 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multimap@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanocolors@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6" + integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ== -nanoid@^3.1.10: - version "3.1.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" - integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== +nanoid@^3.1.23, nanoid@^3.1.28: + version "3.1.29" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" + integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== nanomatch@^1.2.9: version "1.2.13" @@ -3811,11 +3582,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -3862,10 +3628,10 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^1.1.60: - version "1.1.60" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" - integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== +node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" @@ -3889,10 +3655,10 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-all@^4.1.5: version "4.1.5" @@ -3916,12 +3682,12 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: - boolbase "~1.0.0" + boolbase "^1.0.0" nyc@^15.0.0: version "15.1.0" @@ -3970,12 +3736,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -3987,23 +3753,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.pick@^1.3.0: version "1.3.0" @@ -4012,22 +3770,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" + es-abstract "^1.19.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -4048,18 +3798,19 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== -opener@^1.5.1: +opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optimize-css-assets-webpack-plugin@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" - integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== +optimize-css-assets-webpack-plugin@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz#7719bceabba1f3891ec3ae04efb81a1cc99cd793" + integrity sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ== dependencies: - cssnano "^4.1.10" + cssnano "^5.0.2" last-call-webpack-plugin "^3.0.0" + postcss "^8.2.1" optionator@^0.9.1: version "0.9.1" @@ -4073,17 +3824,18 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.0.0.tgz#4f0b34f2994877b49b452a707245ab1e9f6afccb" - integrity sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw== +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: + bl "^4.1.0" chalk "^4.1.0" cli-cursor "^3.1.0" - cli-spinners "^2.4.0" + cli-spinners "^2.5.0" is-interactive "^1.0.0" - log-symbols "^4.0.0" - mute-stream "0.0.8" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" strip-ansi "^6.0.0" wcwidth "^1.0.1" @@ -4106,6 +3858,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -4127,6 +3886,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" @@ -4193,13 +3959,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -4209,20 +3968,15 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4264,21 +4018,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^3.0.0: version "3.0.0" @@ -4293,9 +4035,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -4303,21 +4045,21 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -4342,13 +4084,20 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -4357,9 +4106,9 @@ please-upgrade-node@^3.2.0: semver-compare "^1.0.0" pnp-webpack-plugin@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9" + integrity sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg== dependencies: ts-pnp "^1.1.6" @@ -4368,322 +4117,263 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" - integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== dependencies: - postcss "^7.0.27" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.2" -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== +postcss-colormin@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88" + integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw== dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== +postcss-convert-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232" + integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" + integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + css-color-names "^1.0.1" + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" + integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.6" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + vendors "^1.0.3" -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== +postcss-minify-gradients@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz#7c175c108f06a5629925d698b3c4cf7bd3864ee5" + integrity sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ== dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + colord "^2.6" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== +postcss-minify-params@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" + integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + alphanum-sort "^1.0.2" + browserslist "^4.16.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" uniqs "^2.0.0" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: +postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" + postcss-selector-parser "^6.0.4" -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - postcss "^7.0.0" + icss-utils "^5.0.0" -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-url@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" + integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-reduce-initial@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" + integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.0" + caniuse-api "^3.0.0" -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f" + integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A== dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.1.0" + svgo "^2.3.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" + integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" uniqs "^2.0.0" -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== +postcss@^8.2.1, postcss@^8.2.15: + version "8.3.9" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31" + integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw== dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" + nanoid "^3.1.28" + picocolors "^0.2.1" + source-map-js "^0.6.2" prelude-ls@^1.2.1: version "1.2.1" @@ -4717,14 +4407,6 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.1" - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -4782,16 +4464,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -4802,6 +4474,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4817,29 +4494,6 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -4849,15 +4503,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -4890,7 +4535,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -4908,10 +4553,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -4929,14 +4574,14 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regexp-tree@^0.1.21, regexp-tree@~0.1.1: - version "0.1.21" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" - integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== + version "0.1.24" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== release-zalgo@^1.0.0: version "1.0.0" @@ -4951,9 +4596,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -4965,6 +4610,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -4975,11 +4625,6 @@ reserved-words@^0.1.2: resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4995,11 +4640,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.10.0, resolve@^1.20.0, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" restore-cursor@^3.1.0: @@ -5020,23 +4666,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -5060,9 +4689,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -5071,23 +4702,23 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== +rxjs@^6.6.7: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -5102,16 +4733,11 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -5121,13 +4747,13 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.6, schema-utils@^2.7.0, schema-utils@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" ajv-keywords "^3.5.2" semver-compare@^1.0.0: @@ -5135,45 +4761,28 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== +semver-regex@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.3.tgz#b2bcc6f97f63269f286994e297e229b6245d0dc3" + integrity sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.3.5, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -5181,16 +4790,6 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5211,11 +4810,6 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -5253,30 +4847,41 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= +sirv@^1.0.7: + version "1.0.17" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.17.tgz#86e2c63c612da5a1dace1c16c46f524aaa26ac45" + integrity sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw== dependencies: - is-arrayish "^0.3.1" + "@polka/url" "^1.0.0-next.20" + mime "^2.3.1" + totalist "^1.0.0" size-limit@^4.5.7: - version "4.5.7" - resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-4.5.7.tgz#0bfb8b3bddad0c38388bd0bd3d98bbd7d5b7daee" - integrity sha512-ANvwaaTvMPGyvsoYnzw7AUUA1Xcj0kC4Pu/Mvvii0RS78TVE7mLL/F0kyVXOw0ytdcq0HoPnT2OaXhwxLlvsyA== + version "4.12.0" + resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-4.12.0.tgz#ecc9c0448c049a40b10e76b5e1b4a20f99a54468" + integrity sha512-LwlUDPxFJbJDIJsBE5bKo8kFMuxmuewBMDjgfSoQwnO27V8DSK+j6881nsrX3GoM3bJMFIeEq56thqBEdYC8bw== dependencies: - bytes "^3.1.0" - chokidar "^3.4.2" + bytes-iec "^3.1.1" + chokidar "^3.5.1" ci-job-number "^1.2.2" - colorette "^1.2.1" - cosmiconfig "^7.0.0" - globby "^11.0.1" - ora "^5.0.0" + colorette "^1.2.2" + globby "^11.0.3" + lilconfig "^2.0.3" + ora "^5.4.1" read-pkg-up "^7.0.1" slash@^3.0.0: @@ -5284,15 +4889,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -5346,6 +4942,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -5358,19 +4959,19 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.17, source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -5414,9 +5015,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -5431,9 +5032,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" @@ -5450,11 +5051,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -5492,47 +5088,39 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.padend@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" - integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.1" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -5557,19 +5145,12 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -5591,22 +5172,21 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" - integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== dependencies: loader-utils "^2.0.0" - schema-utils "^2.6.6" + schema-utils "^3.0.0" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" supports-color@^5.3.0: version "5.5.0" @@ -5615,13 +5195,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -5629,34 +5202,30 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" +svgo@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.7.0.tgz#e164cded22f4408fe4978f082be80159caea1e2d" + integrity sha512-aDLsGkre4fTDCWvolyW+fs8ZJFABpzLXbtdK1y71CKnHzAnpDxKXPj2mNKj+pyOXUCzFHzuxRJ94XOFygOWV3w== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + nanocolors "^0.1.12" stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9: + version "6.7.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -5715,9 +5284,9 @@ through@^2.3.8: integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" @@ -5768,15 +5337,10 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== ts-node@^8.10.2: version "8.10.2" @@ -5794,10 +5358,10 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" @@ -5805,14 +5369,14 @@ tsconfig-paths@^3.9.0: strip-bom "^3.0.0" tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" - integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tslint@^6.1.2: version "6.1.3" @@ -5841,9 +5405,9 @@ tsutils@^2.29.0: tslib "^1.8.1" tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -5859,10 +5423,15 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" @@ -5874,14 +5443,6 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5895,9 +5456,19 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.9.7: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" union-value@^1.0.0: version "1.0.1" @@ -5909,11 +5480,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" @@ -5933,16 +5499,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -5957,9 +5513,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -5981,21 +5537,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -6010,20 +5556,15 @@ util@^0.11.0: dependencies: inherits "2.0.3" -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -6033,12 +5574,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: +vendors@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== @@ -6048,23 +5584,23 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" wcwidth@^1.0.1: version "1.0.1" @@ -6073,24 +5609,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-bundle-analyzer@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" - integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw== +webpack-bundle-analyzer@^4.4.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - bfj "^6.1.1" - chalk "^2.4.1" - commander "^2.18.0" - ejs "^2.6.1" - express "^4.16.3" - filesize "^3.6.1" - gzip-size "^5.0.0" - lodash "^4.17.15" - mkdirp "^0.5.1" - opener "^1.5.1" - ws "^6.0.0" + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" @@ -6101,9 +5633,9 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-map "~0.6.1" webpack@^4.44.1: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -6113,7 +5645,7 @@ webpack@^4.44.1: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -6129,6 +5661,17 @@ webpack@^4.44.1: watchpack "^1.7.4" webpack-sources "^1.4.1" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -6174,6 +5717,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6189,19 +5741,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" +ws@^7.3.1: + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -6209,19 +5752,24 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0, yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@^18.1.2: version "18.1.3" @@ -6252,3 +5800,8 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6f886ae669c351c6dfc3d02e853bc6294cf3d054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D=C4=99bski?= Date: Wed, 13 Oct 2021 11:37:02 +0200 Subject: [PATCH 119/119] 1.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 76f0aa3..b40bca8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typedjson", - "version": "1.8.0-rc1", + "version": "1.8.0", "description": "Typed JSON parsing and serializing for TypeScript that preserves type information, using decorators. Parse JSON into actual class instances.", "main": "./lib/cjs/index.js", "module": "./lib/esm5/index.js",