@tsed/json-mapper 7.0.0-beta.2 → 7.0.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/coverage.json +6 -0
  2. package/jest.config.js +9 -0
  3. package/lib/cjs/components/ArrayMapper.js +1 -1
  4. package/lib/cjs/components/DateMapper.js +1 -1
  5. package/lib/cjs/components/MapMapper.js +1 -1
  6. package/lib/cjs/components/PrimitiveMapper.js +1 -1
  7. package/lib/cjs/components/SetMapper.js +1 -1
  8. package/lib/cjs/components/SymbolMapper.js +1 -1
  9. package/lib/cjs/domain/JsonMapperContext.js +4 -0
  10. package/lib/cjs/domain/JsonMapperContext.js.map +1 -1
  11. package/lib/cjs/domain/JsonMapperTypesContainer.js.map +1 -1
  12. package/lib/cjs/hooks/alterAfterDeserialize.js +1 -2
  13. package/lib/cjs/hooks/alterAfterDeserialize.js.map +1 -1
  14. package/lib/cjs/hooks/alterBeforeDeserialize.js +1 -2
  15. package/lib/cjs/hooks/alterBeforeDeserialize.js.map +1 -1
  16. package/lib/cjs/index.js +21 -11
  17. package/lib/cjs/index.js.map +1 -1
  18. package/lib/cjs/package.json +3 -0
  19. package/lib/cjs/utils/deserialize.js +62 -33
  20. package/lib/cjs/utils/deserialize.js.map +1 -1
  21. package/lib/cjs/utils/serialize.js +38 -8
  22. package/lib/cjs/utils/serialize.js.map +1 -1
  23. package/lib/esm/components/ArrayMapper.js +1 -1
  24. package/lib/esm/components/DateMapper.js +1 -1
  25. package/lib/esm/components/MapMapper.js +1 -1
  26. package/lib/esm/components/PrimitiveMapper.js +1 -1
  27. package/lib/esm/components/SetMapper.js +1 -1
  28. package/lib/esm/components/SymbolMapper.js +1 -1
  29. package/lib/esm/decorators/jsonMapper.js +1 -1
  30. package/lib/esm/domain/JsonMapperContext.js +4 -0
  31. package/lib/esm/domain/JsonMapperContext.js.map +1 -1
  32. package/lib/esm/domain/JsonMapperTypesContainer.js.map +1 -1
  33. package/lib/esm/hooks/alterAfterDeserialize.js +1 -2
  34. package/lib/esm/hooks/alterAfterDeserialize.js.map +1 -1
  35. package/lib/esm/hooks/alterBeforeDeserialize.js +1 -2
  36. package/lib/esm/hooks/alterBeforeDeserialize.js.map +1 -1
  37. package/lib/esm/index.js +21 -11
  38. package/lib/esm/index.js.map +1 -1
  39. package/lib/esm/package.json +3 -0
  40. package/lib/esm/utils/deserialize.js +67 -38
  41. package/lib/esm/utils/deserialize.js.map +1 -1
  42. package/lib/esm/utils/serialize.js +41 -11
  43. package/lib/esm/utils/serialize.js.map +1 -1
  44. package/lib/types/domain/JsonMapperTypesContainer.d.ts +2 -2
  45. package/lib/types/index.d.ts +13 -3
  46. package/lib/types/utils/deserialize.d.ts +6 -1
  47. package/lib/types/utils/serialize.d.ts +7 -2
  48. package/package.json +29 -12
  49. package/readme.md +4 -2
  50. package/tsconfig.compile.esm.json +1 -12
  51. package/lib/cjs/components/index.js +0 -10
  52. package/lib/cjs/components/index.js.map +0 -1
  53. package/lib/esm/components/index.js +0 -7
  54. package/lib/esm/components/index.js.map +0 -1
  55. package/lib/types/components/index.d.ts +0 -6
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { objectKeys } from "@tsed/core";
3
- import { JsonMapper } from "../decorators/jsonMapper";
3
+ import { JsonMapper } from "../decorators/jsonMapper.js";
4
4
  /**
5
5
  * Mapper for the `Set` Type.
6
6
  * @jsonmapper
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from "tslib";
2
- import { JsonMapper } from "../decorators/jsonMapper";
2
+ import { JsonMapper } from "../decorators/jsonMapper.js";
3
3
  /**
4
4
  * Mapper for the `Symbol` type.
5
5
  *
@@ -1,4 +1,4 @@
1
- import { registerJsonTypeMapper } from "../domain/JsonMapperTypesContainer";
1
+ import { registerJsonTypeMapper } from "../domain/JsonMapperTypesContainer.js";
2
2
  /**
3
3
  * Register a new JsonMapper Type
4
4
  * @param types
@@ -3,6 +3,10 @@ import { isCollection } from "@tsed/core";
3
3
  * @ignore
4
4
  */
5
5
  export class JsonMapperContext {
6
+ collectionType;
7
+ type;
8
+ options;
9
+ _next;
6
10
  constructor({ type, collectionType, next, options }) {
7
11
  this.type = type;
8
12
  this.collectionType = isCollection(collectionType) ? collectionType : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"JsonMapperContext.js","sourceRoot":"","sources":["../../../src/domain/JsonMapperContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAO,MAAM,YAAY,CAAC;AAS9C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAM5B,YAAY,EAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAyB;QACvE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,IAAI,CAAC,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import {isCollection, Type} from \"@tsed/core\";\nimport {JsonMapperCtx} from \"../interfaces/JsonMapperMethods\";\n/**\n * @ignore\n */\nexport interface JsonMapperContextProps extends Partial<Omit<JsonMapperCtx, \"next\">> {\n next: (data: any, options: any) => void;\n options: any;\n}\n/**\n * @ignore\n */\nexport class JsonMapperContext implements JsonMapperCtx {\n readonly collectionType: Type<any> | undefined;\n readonly type: Type<any> | any;\n readonly options: any;\n private _next: (data: any, options: any) => void;\n\n constructor({type, collectionType, next, options}: JsonMapperContextProps) {\n this.type = type;\n this.collectionType = isCollection(collectionType) ? collectionType : undefined;\n this._next = next;\n this.options = options;\n }\n\n next(data: any) {\n return this._next(data, {\n ...this.options,\n type: this.type\n });\n }\n}\n"]}
1
+ {"version":3,"file":"JsonMapperContext.js","sourceRoot":"","sources":["../../../src/domain/JsonMapperContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAO,MAAM,YAAY,CAAC;AAS9C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACnB,cAAc,CAAwB;IACtC,IAAI,CAAkB;IACtB,OAAO,CAAM;IACd,KAAK,CAAoC;IAEjD,YAAY,EAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAyB;QACvE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,IAAI,CAAC,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import {isCollection, Type} from \"@tsed/core\";\nimport {JsonMapperCtx} from \"../interfaces/JsonMapperMethods\";\n/**\n * @ignore\n */\nexport interface JsonMapperContextProps extends Partial<Omit<JsonMapperCtx, \"next\">> {\n next: (data: any, options: any) => void;\n options: any;\n}\n/**\n * @ignore\n */\nexport class JsonMapperContext implements JsonMapperCtx {\n readonly collectionType: Type<any> | undefined;\n readonly type: Type<any> | any;\n readonly options: any;\n private _next: (data: any, options: any) => void;\n\n constructor({type, collectionType, next, options}: JsonMapperContextProps) {\n this.type = type;\n this.collectionType = isCollection(collectionType) ? collectionType : undefined;\n this._next = next;\n this.options = options;\n }\n\n next(data: any) {\n return this._next(data, {\n ...this.options,\n type: this.type\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonMapperTypesContainer.js","sourceRoot":"","sources":["../../../src/domain/JsonMapperTypesContainer.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,yCAAyC;AACzC,MAAM,wBAAwB,GAA+C,IAAI,GAAG,EAAE,CAAC;AACvF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAe,EAAE,KAA8B;IACpF,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,wBAAwB,CAAC;AAClC,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n/**\n * @ignore\n */\n// tslint:disable-next-line:variable-name\nconst JsonMapperTypesContainer: Map<Type<any> | Symbol, JsonMapperMethods> = new Map();\n/**\n * @ignore\n */\nexport function registerJsonTypeMapper(type: Type<any>, token: Type<JsonMapperMethods>) {\n JsonMapperTypesContainer.set(type, new token());\n}\n/**\n * @ignore\n */\nexport function getJsonMapperTypes(): WeakMap<Type<any> | Symbol, JsonMapperMethods> {\n return JsonMapperTypesContainer;\n}\n"]}
1
+ {"version":3,"file":"JsonMapperTypesContainer.js","sourceRoot":"","sources":["../../../src/domain/JsonMapperTypesContainer.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,yCAAyC;AACzC,MAAM,wBAAwB,GAAwD,IAAI,GAAG,EAAE,CAAC;AAChG;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAiC,EAAE,KAA8B;IACtG,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,wBAAwB,CAAC;AAClC,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n/**\n * @ignore\n */\n// tslint:disable-next-line:variable-name\nconst JsonMapperTypesContainer: Map<Type<any> | Symbol | string, JsonMapperMethods> = new Map();\n/**\n * @ignore\n */\nexport function registerJsonTypeMapper(type: Type<any> | Symbol | string, token: Type<JsonMapperMethods>) {\n JsonMapperTypesContainer.set(type, new token());\n}\n/**\n * @ignore\n */\nexport function getJsonMapperTypes(): Map<Type<any> | Symbol | string, JsonMapperMethods> {\n return JsonMapperTypesContainer;\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  export function alterAfterDeserialize(data, schema, options) {
2
- var _a;
3
- return (_a = schema === null || schema === void 0 ? void 0 : schema.$hooks) === null || _a === void 0 ? void 0 : _a.alter("afterDeserialize", data, [options]);
2
+ return schema?.$hooks?.alter("afterDeserialize", data, [options]);
4
3
  }
5
4
  //# sourceMappingURL=alterAfterDeserialize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alterAfterDeserialize.js","sourceRoot":"","sources":["../../../src/hooks/alterAfterDeserialize.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,IAAS,EAAE,MAAuB,EAAE,OAAY;;IACpF,OAAO,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import {Hooks} from \"@tsed/core\";\n\nexport function alterAfterDeserialize(data: any, schema: {$hooks: Hooks}, options: any) {\n return schema?.$hooks?.alter(\"afterDeserialize\", data, [options]);\n}\n"]}
1
+ {"version":3,"file":"alterAfterDeserialize.js","sourceRoot":"","sources":["../../../src/hooks/alterAfterDeserialize.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,IAAS,EAAE,MAAuB,EAAE,OAAY;IACpF,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import {Hooks} from \"@tsed/core\";\n\nexport function alterAfterDeserialize(data: any, schema: {$hooks: Hooks}, options: any) {\n return schema?.$hooks?.alter(\"afterDeserialize\", data, [options]);\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  export function alterBeforeDeserialize(data, schema, options) {
2
- var _a;
3
- return (_a = schema === null || schema === void 0 ? void 0 : schema.$hooks) === null || _a === void 0 ? void 0 : _a.alter("beforeDeserialize", data, [options]);
2
+ return schema?.$hooks?.alter("beforeDeserialize", data, [options]);
4
3
  }
5
4
  //# sourceMappingURL=alterBeforeDeserialize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alterBeforeDeserialize.js","sourceRoot":"","sources":["../../../src/hooks/alterBeforeDeserialize.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAS,EAAE,MAAuB,EAAE,OAAY;;IACrF,OAAO,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import {Hooks} from \"@tsed/core\";\n\nexport function alterBeforeDeserialize(data: any, schema: {$hooks: Hooks}, options: any) {\n return schema?.$hooks?.alter(\"beforeDeserialize\", data, [options]);\n}\n"]}
1
+ {"version":3,"file":"alterBeforeDeserialize.js","sourceRoot":"","sources":["../../../src/hooks/alterBeforeDeserialize.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAS,EAAE,MAAuB,EAAE,OAAY;IACrF,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import {Hooks} from \"@tsed/core\";\n\nexport function alterBeforeDeserialize(data: any, schema: {$hooks: Hooks}, options: any) {\n return schema?.$hooks?.alter(\"beforeDeserialize\", data, [options]);\n}\n"]}
package/lib/esm/index.js CHANGED
@@ -1,12 +1,22 @@
1
- export * from "./components";
2
- export * from "./decorators/jsonMapper";
3
- export * from "./decorators/onDeserialize";
4
- export * from "./decorators/onSerialize";
5
- export * from "./decorators/afterDeserialize";
6
- export * from "./decorators/beforeDeserialize";
7
- export * from "./domain/JsonMapperContext";
8
- export * from "./domain/JsonMapperTypesContainer";
9
- export * from "./interfaces/JsonMapperMethods";
10
- export * from "./utils/deserialize";
11
- export * from "./utils/serialize";
1
+ /**
2
+ * @file Automatically generated by barrelsby.
3
+ */
4
+ export * from "./components/ArrayMapper.js";
5
+ export * from "./components/DateMapper.js";
6
+ export * from "./components/MapMapper.js";
7
+ export * from "./components/PrimitiveMapper.js";
8
+ export * from "./components/SetMapper.js";
9
+ export * from "./components/SymbolMapper.js";
10
+ export * from "./decorators/afterDeserialize.js";
11
+ export * from "./decorators/beforeDeserialize.js";
12
+ export * from "./decorators/jsonMapper.js";
13
+ export * from "./decorators/onDeserialize.js";
14
+ export * from "./decorators/onSerialize.js";
15
+ export * from "./domain/JsonMapperContext.js";
16
+ export * from "./domain/JsonMapperTypesContainer.js";
17
+ export * from "./hooks/alterAfterDeserialize.js";
18
+ export * from "./hooks/alterBeforeDeserialize.js";
19
+ export * from "./interfaces/JsonMapperMethods.js";
20
+ export * from "./utils/deserialize.js";
21
+ export * from "./utils/serialize.js";
12
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from \"./components\";\nexport * from \"./decorators/jsonMapper\";\nexport * from \"./decorators/onDeserialize\";\nexport * from \"./decorators/onSerialize\";\nexport * from \"./decorators/afterDeserialize\";\nexport * from \"./decorators/beforeDeserialize\";\nexport * from \"./domain/JsonMapperContext\";\nexport * from \"./domain/JsonMapperTypesContainer\";\nexport * from \"./interfaces/JsonMapperMethods\";\nexport * from \"./utils/deserialize\";\nexport * from \"./utils/serialize\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC","sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from \"./components/ArrayMapper\";\nexport * from \"./components/DateMapper\";\nexport * from \"./components/MapMapper\";\nexport * from \"./components/PrimitiveMapper\";\nexport * from \"./components/SetMapper\";\nexport * from \"./components/SymbolMapper\";\nexport * from \"./decorators/afterDeserialize\";\nexport * from \"./decorators/beforeDeserialize\";\nexport * from \"./decorators/jsonMapper\";\nexport * from \"./decorators/onDeserialize\";\nexport * from \"./decorators/onSerialize\";\nexport * from \"./domain/JsonMapperContext\";\nexport * from \"./domain/JsonMapperTypesContainer\";\nexport * from \"./hooks/alterAfterDeserialize\";\nexport * from \"./hooks/alterBeforeDeserialize\";\nexport * from \"./interfaces/JsonMapperMethods\";\nexport * from \"./utils/deserialize\";\nexport * from \"./utils/serialize\";\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -1,10 +1,15 @@
1
- import { isArray, isEmpty, isNil, nameOf, objectKeys } from "@tsed/core";
1
+ import { isArray, isBoolean, isClass, isEmpty, isNil, nameOf, objectKeys } from "@tsed/core";
2
2
  import { alterIgnore, getProperties, JsonEntityStore, JsonSchema } from "@tsed/schema";
3
- import "../components";
4
- import { JsonMapperContext } from "../domain/JsonMapperContext";
5
- import { getJsonMapperTypes } from "../domain/JsonMapperTypesContainer";
6
- import { alterAfterDeserialize } from "../hooks/alterAfterDeserialize";
7
- import { alterBeforeDeserialize } from "../hooks/alterBeforeDeserialize";
3
+ import "../components/ArrayMapper.js";
4
+ import "../components/DateMapper.js";
5
+ import "../components/MapMapper.js";
6
+ import "../components/PrimitiveMapper.js";
7
+ import "../components/SetMapper.js";
8
+ import "../components/SymbolMapper.js";
9
+ import { JsonMapperContext } from "../domain/JsonMapperContext.js";
10
+ import { getJsonMapperTypes } from "../domain/JsonMapperTypesContainer.js";
11
+ import { alterAfterDeserialize } from "../hooks/alterAfterDeserialize.js";
12
+ import { alterBeforeDeserialize } from "../hooks/alterBeforeDeserialize.js";
8
13
  function isDeserializable(obj, options) {
9
14
  if ((!!options.collectionType && isNil(obj)) || obj === undefined) {
10
15
  return false;
@@ -15,7 +20,6 @@ function alterValue(schema, value, options) {
15
20
  return schema.$hooks.alter("onDeserialize", value, [options]);
16
21
  }
17
22
  function transformCollection(src, options) {
18
- var _a;
19
23
  const { types, type = Object, collectionType } = options;
20
24
  const context = new JsonMapperContext({
21
25
  type,
@@ -23,17 +27,43 @@ function transformCollection(src, options) {
23
27
  options,
24
28
  next: (data, { collectionType, ...options }) => deserialize(data, options)
25
29
  });
26
- return (_a = types === null || types === void 0 ? void 0 : types.get(options.collectionType)) === null || _a === void 0 ? void 0 : _a.deserialize(src, context);
30
+ return types?.get(options.collectionType)?.deserialize(src, context);
27
31
  }
28
32
  function transformType(src, options) {
29
- var _a;
30
33
  const { types, type = Object } = options;
31
34
  const context = new JsonMapperContext({
32
35
  type,
33
36
  options,
34
37
  next: (data, { type, ...options }) => deserialize(data, options)
35
38
  });
36
- return (_a = types === null || types === void 0 ? void 0 : types.get(type)) === null || _a === void 0 ? void 0 : _a.deserialize(src, context);
39
+ return types?.get(type)?.deserialize(src, context);
40
+ }
41
+ function mapItemOptions(propStore, options) {
42
+ const itemOpts = {
43
+ ...options,
44
+ store: undefined,
45
+ type: propStore.computedType
46
+ };
47
+ if (propStore.schema.hasGenerics) {
48
+ itemOpts.nestedGenerics = propStore.schema.nestedGenerics;
49
+ }
50
+ else if (propStore.schema.isGeneric && options.nestedGenerics) {
51
+ const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
52
+ const genericLabels = propStore.parent.schema.genericLabels || [];
53
+ itemOpts.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;
54
+ if (itemOpts.type instanceof JsonSchema) {
55
+ itemOpts.type = itemOpts.type.getTarget();
56
+ }
57
+ itemOpts.nestedGenerics = nestedGenerics;
58
+ }
59
+ return itemOpts;
60
+ }
61
+ function getAdditionalProperties(nbProps, store, options) {
62
+ const additionalProperties = store.schema.get("additionalProperties");
63
+ if (isBoolean(additionalProperties) || isClass(additionalProperties)) {
64
+ return additionalProperties;
65
+ }
66
+ return nbProps === 0 || !!options.additionalProperties;
37
67
  }
38
68
  /**
39
69
  * Transform given plain object to class.
@@ -44,47 +74,47 @@ export function plainObjectToClass(src, options) {
44
74
  if (isEmpty(src)) {
45
75
  return src;
46
76
  }
47
- const { type, store = JsonEntityStore.from(type), ...next } = options;
77
+ const { type, store = JsonEntityStore.from(type) } = options;
48
78
  const propertiesMap = getProperties(store, { ...options, withIgnoredProps: true });
49
- let keys = objectKeys(src);
50
- const additionalProperties = propertiesMap.size ? !!store.schema.get("additionalProperties") || options.additionalProperties : true;
79
+ let keys = new Set(objectKeys(src));
80
+ const additionalProperties = getAdditionalProperties(propertiesMap.size, store, options);
51
81
  src = alterBeforeDeserialize(src, store.schema, options);
52
82
  const out = new type(src);
53
83
  propertiesMap.forEach((propStore) => {
54
84
  const key = options.useAlias
55
85
  ? propStore.parent.schema.getAliasOf(propStore.propertyName) || propStore.propertyName
56
86
  : propStore.propertyName;
57
- keys = keys.filter((k) => k !== key);
58
- next.type = propStore.computedType;
59
- if (alterIgnore(propStore.itemSchema, options)) {
87
+ keys.delete(key);
88
+ if (alterIgnore(propStore.schema, options)) {
60
89
  return;
61
90
  }
62
91
  let value = alterValue(propStore.schema, src[key], { ...options, self: src });
63
- if (propStore.schema.hasGenerics) {
64
- next.nestedGenerics = propStore.schema.nestedGenerics;
65
- }
66
- else if (propStore.schema.isGeneric && options.nestedGenerics) {
67
- const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
68
- const genericLabels = propStore.parent.schema.genericLabels || [];
69
- next.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;
70
- if (next.type instanceof JsonSchema) {
71
- next.type = next.type.getTarget();
72
- }
73
- next.nestedGenerics = nestedGenerics;
74
- }
92
+ const itemOptions = mapItemOptions(propStore, options);
75
93
  value = deserialize(value, {
76
- ...next,
77
- type: value === src[key] ? next.type : undefined,
94
+ ...itemOptions,
95
+ self: src,
96
+ type: value === src[key] ? itemOptions.type : undefined,
78
97
  collectionType: propStore.collectionType
79
98
  });
80
- if (value !== undefined) {
99
+ if (value !== undefined && !propStore.schema.isReadOnly) {
81
100
  out[propStore.propertyName] = value;
82
101
  }
83
102
  });
84
103
  if (additionalProperties) {
85
- keys.forEach((key) => {
86
- out[key] = src[key];
87
- });
104
+ if (isBoolean(additionalProperties)) {
105
+ keys.forEach((key) => {
106
+ out[key] = src[key];
107
+ });
108
+ }
109
+ else {
110
+ const type = additionalProperties.getComputedType();
111
+ keys.forEach((key) => {
112
+ out[key] = deserialize(src[key], {
113
+ ...options,
114
+ type
115
+ });
116
+ });
117
+ }
88
118
  }
89
119
  return alterAfterDeserialize(out, store.schema, options);
90
120
  }
@@ -95,7 +125,7 @@ function buildOptions(options) {
95
125
  }
96
126
  options.type = options.store.computedType;
97
127
  options.collectionType = options.store.collectionType;
98
- delete options.store;
128
+ options.store = undefined;
99
129
  }
100
130
  return {
101
131
  groups: false,
@@ -112,7 +142,6 @@ function buildOptions(options) {
112
142
  * @param options
113
143
  */
114
144
  export function deserialize(src, options = {}) {
115
- var _a, _b;
116
145
  options = buildOptions(options);
117
146
  if (!isDeserializable(src, options)) {
118
147
  return src;
@@ -121,12 +150,12 @@ export function deserialize(src, options = {}) {
121
150
  options.collectionType = Array;
122
151
  }
123
152
  if (options.collectionType) {
124
- if (!((_a = options.types) === null || _a === void 0 ? void 0 : _a.has(options.collectionType))) {
153
+ if (!options.types?.has(options.collectionType)) {
125
154
  throw new Error(`${nameOf(options.collectionType)} is not supported by JsonMapper.`);
126
155
  }
127
156
  return transformCollection(src, options);
128
157
  }
129
- if ((_b = options.types) === null || _b === void 0 ? void 0 : _b.has(options.type)) {
158
+ if (options.types?.has(options.type)) {
130
159
  return transformType(src, options);
131
160
  }
132
161
  // class converter
@@ -1 +1 @@
1
- {"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../../src/utils/deserialize.ts"],"names":[],"mappings":"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","sourcesContent":["import {isArray, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {alterIgnore, getProperties, JsonEntityStore, JsonHookContext, JsonSchema} from \"@tsed/schema\";\nimport \"../components\";\nimport {JsonMapperContext} from \"../domain/JsonMapperContext\";\nimport {getJsonMapperTypes} from \"../domain/JsonMapperTypesContainer\";\nimport {alterAfterDeserialize} from \"../hooks/alterAfterDeserialize\";\nimport {alterBeforeDeserialize} from \"../hooks/alterBeforeDeserialize\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n\nexport interface JsonDeserializerOptions<T = any, C = any> extends MetadataTypes<T, C> {\n /**\n * Types used to map complex types (Symbol, Array, Set, Map)\n */\n types?: WeakMap<Type<any>, JsonMapperMethods>;\n /**\n * useAlias mapping\n */\n useAlias?: boolean;\n /**\n * Accept additionalProperties or ignore it\n */\n additionalProperties?: boolean;\n /**\n * Use the store which have all metadata to deserialize correctly the model. This\n * property is useful when you deal with metadata parameters.\n */\n store?: JsonEntityStore;\n /**\n *\n */\n groups?: string[] | false;\n\n [key: string]: any;\n}\n\nfunction isDeserializable(obj: any, options: JsonDeserializerOptions) {\n if ((!!options.collectionType && isNil(obj)) || obj === undefined) {\n return false;\n }\n\n return !(isEmpty(options.type) || (options.type === Object && !options.collectionType));\n}\n\nfunction alterValue(schema: JsonSchema, value: any, options: JsonHookContext) {\n return schema.$hooks.alter(\"onDeserialize\", value, [options]);\n}\n\nfunction transformCollection<T = any>(src: any, options: JsonDeserializerOptions<any, any>): T {\n const {types, type = Object, collectionType} = options;\n\n const context = new JsonMapperContext({\n type,\n collectionType,\n options,\n next: (data, {collectionType, ...options}) => deserialize(data, options)\n });\n\n return types?.get(options.collectionType)?.deserialize<T>(src, context);\n}\n\nfunction transformType<T = any>(src: any, options: JsonDeserializerOptions<any, any>): T {\n const {types, type = Object} = options;\n\n const context = new JsonMapperContext({\n type,\n options,\n next: (data, {type, ...options}) => deserialize(data, options)\n });\n\n return types?.get(type)?.deserialize<T>(src, context);\n}\n\n/**\n * Transform given plain object to class.\n * @param src\n * @param options\n */\nexport function plainObjectToClass<T = any>(src: any, options: JsonDeserializerOptions): T {\n if (isEmpty(src)) {\n return src;\n }\n\n const {type, store = JsonEntityStore.from(type), ...next} = options;\n\n const propertiesMap = getProperties(store, {...options, withIgnoredProps: true});\n\n let keys = objectKeys(src);\n const additionalProperties = propertiesMap.size ? !!store.schema.get(\"additionalProperties\") || options.additionalProperties : true;\n src = alterBeforeDeserialize(src, store.schema, options);\n const out: any = new type(src);\n\n propertiesMap.forEach((propStore) => {\n const key = options.useAlias\n ? propStore.parent.schema.getAliasOf(propStore.propertyName) || propStore.propertyName\n : propStore.propertyName;\n\n keys = keys.filter((k) => k !== key);\n\n next.type = propStore.computedType;\n\n if (alterIgnore(propStore.itemSchema, options)) {\n return;\n }\n\n let value = alterValue(propStore.schema, src[key], {...options, self: src});\n\n if (propStore.schema.hasGenerics) {\n next.nestedGenerics = propStore.schema.nestedGenerics;\n } else if (propStore.schema.isGeneric && options.nestedGenerics) {\n const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;\n const genericLabels = propStore.parent.schema.genericLabels || [];\n\n next.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;\n\n if (next.type instanceof JsonSchema) {\n next.type = next.type.getTarget();\n }\n\n next.nestedGenerics = nestedGenerics;\n }\n\n value = deserialize(value, {\n ...next,\n type: value === src[key] ? next.type : undefined,\n collectionType: propStore.collectionType\n });\n\n if (value !== undefined) {\n out[propStore.propertyName] = value;\n }\n });\n\n if (additionalProperties) {\n keys.forEach((key) => {\n out[key] = src[key];\n });\n }\n\n return alterAfterDeserialize(out, store.schema, options);\n}\n\nfunction buildOptions(options: JsonDeserializerOptions<any, any>): any {\n if (options.store instanceof JsonEntityStore) {\n if (options.store.parameter && options.store.parameter.nestedGenerics.length) {\n options.nestedGenerics = options.store.parameter.nestedGenerics;\n }\n\n options.type = options.store.computedType;\n options.collectionType = options.store.collectionType;\n\n delete options.store;\n }\n\n return {\n groups: false,\n useAlias: true,\n ...options,\n type: options.type ? options.type : undefined,\n types: options.types ? options.types : getJsonMapperTypes()\n };\n}\n\n/**\n * Transform given source to class base on the given `options.type`.\n *\n * @param src\n * @param options\n */\nexport function deserialize<T = any>(src: any, options: JsonDeserializerOptions = {}): T {\n options = buildOptions(options);\n\n if (!isDeserializable(src, options)) {\n return src;\n }\n\n if (!options.collectionType && isArray(src)) {\n options.collectionType = Array;\n }\n\n if (options.collectionType) {\n if (!options.types?.has(options.collectionType)) {\n throw new Error(`${nameOf(options.collectionType)} is not supported by JsonMapper.`);\n }\n\n return transformCollection(src, options);\n }\n\n if (options.types?.has(options.type)) {\n return transformType(src, options);\n }\n\n // class converter\n return plainObjectToClass(src, options);\n}\n"]}
1
+ {"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../../src/utils/deserialize.ts"],"names":[],"mappings":"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","sourcesContent":["import {isArray, isBoolean, isClass, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {alterIgnore, getProperties, JsonClassStore, JsonEntityStore, JsonHookContext, JsonPropertyStore, JsonSchema} from \"@tsed/schema\";\nimport \"../components/ArrayMapper\";\nimport \"../components/DateMapper\";\nimport \"../components/MapMapper\";\nimport \"../components/PrimitiveMapper\";\nimport \"../components/SetMapper\";\nimport \"../components/SymbolMapper\";\nimport {JsonMapperContext} from \"../domain/JsonMapperContext\";\nimport {getJsonMapperTypes} from \"../domain/JsonMapperTypesContainer\";\nimport {alterAfterDeserialize} from \"../hooks/alterAfterDeserialize\";\nimport {alterBeforeDeserialize} from \"../hooks/alterBeforeDeserialize\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n\nexport interface JsonDeserializerOptions<T = any, C = any> extends MetadataTypes<T, C> {\n /**\n * Types used to map complex types (Symbol, Array, Set, Map)\n */\n types?: WeakMap<Type<any>, JsonMapperMethods>;\n /**\n * useAlias mapping\n */\n useAlias?: boolean;\n /**\n * Accept additionalProperties or ignore it\n */\n additionalProperties?: boolean;\n /**\n * Use the store which have all metadata to deserialize correctly the model. This\n * property is useful when you deal with metadata parameters.\n */\n store?: JsonEntityStore;\n /**\n *\n */\n groups?: string[] | false;\n\n [key: string]: any;\n}\n\nfunction isDeserializable(obj: any, options: JsonDeserializerOptions) {\n if ((!!options.collectionType && isNil(obj)) || obj === undefined) {\n return false;\n }\n\n return !(isEmpty(options.type) || (options.type === Object && !options.collectionType));\n}\n\nfunction alterValue(schema: JsonSchema, value: any, options: JsonHookContext) {\n return schema.$hooks.alter(\"onDeserialize\", value, [options]);\n}\n\nfunction transformCollection<T = any>(src: any, options: JsonDeserializerOptions<any, any>): T {\n const {types, type = Object, collectionType} = options;\n\n const context = new JsonMapperContext({\n type,\n collectionType,\n options,\n next: (data, {collectionType, ...options}) => deserialize(data, options)\n });\n\n return types?.get(options.collectionType)?.deserialize<T>(src, context);\n}\n\nfunction transformType<T = any>(src: any, options: JsonDeserializerOptions<any, any>): T {\n const {types, type = Object} = options;\n\n const context = new JsonMapperContext({\n type,\n options,\n next: (data, {type, ...options}) => deserialize(data, options)\n });\n\n return types?.get(type)?.deserialize<T>(src, context);\n}\n\nfunction mapItemOptions(propStore: JsonPropertyStore, options: JsonDeserializerOptions) {\n const itemOpts: JsonDeserializerOptions = {\n ...options,\n store: undefined,\n type: propStore.computedType\n };\n\n if (propStore.schema.hasGenerics) {\n itemOpts.nestedGenerics = propStore.schema.nestedGenerics;\n } else if (propStore.schema.isGeneric && options.nestedGenerics) {\n const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;\n const genericLabels = propStore.parent.schema.genericLabels || [];\n\n itemOpts.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;\n\n if (itemOpts.type instanceof JsonSchema) {\n itemOpts.type = itemOpts.type.getTarget();\n }\n\n itemOpts.nestedGenerics = nestedGenerics;\n }\n\n return itemOpts;\n}\n\nfunction getAdditionalProperties(\n nbProps: number,\n store: JsonEntityStore,\n options: JsonDeserializerOptions<any, any>\n): boolean | JsonSchema {\n const additionalProperties = store.schema.get(\"additionalProperties\");\n\n if (isBoolean(additionalProperties) || isClass(additionalProperties)) {\n return additionalProperties;\n }\n\n return nbProps === 0 || !!options.additionalProperties;\n}\n\n/**\n * Transform given plain object to class.\n * @param src\n * @param options\n */\nexport function plainObjectToClass<T = any>(src: any, options: JsonDeserializerOptions): T {\n if (isEmpty(src)) {\n return src;\n }\n\n const {type, store = JsonEntityStore.from(type)} = options;\n const propertiesMap = getProperties(store, {...options, withIgnoredProps: true});\n\n let keys = new Set<any>(objectKeys(src));\n\n const additionalProperties = getAdditionalProperties(propertiesMap.size, store, options);\n src = alterBeforeDeserialize(src, store.schema, options);\n\n const out: any = new type(src);\n\n propertiesMap.forEach((propStore) => {\n const key = options.useAlias\n ? propStore.parent.schema.getAliasOf(propStore.propertyName) || propStore.propertyName\n : propStore.propertyName;\n\n keys.delete(key);\n\n if (alterIgnore(propStore.schema, options)) {\n return;\n }\n\n let value = alterValue(propStore.schema, src[key], {...options, self: src});\n\n const itemOptions = mapItemOptions(propStore, options);\n\n value = deserialize(value, {\n ...itemOptions,\n self: src,\n type: value === src[key] ? itemOptions.type : undefined,\n collectionType: propStore.collectionType\n });\n\n if (value !== undefined && !propStore.schema.isReadOnly) {\n out[propStore.propertyName] = value;\n }\n });\n\n if (additionalProperties) {\n if (isBoolean(additionalProperties)) {\n keys.forEach((key) => {\n out[key] = src[key];\n });\n } else {\n const type = additionalProperties.getComputedType();\n keys.forEach((key) => {\n out[key] = deserialize(src[key], {\n ...options,\n type\n });\n });\n }\n }\n\n return alterAfterDeserialize(out, store.schema, options);\n}\n\nfunction buildOptions(options: JsonDeserializerOptions<any, any>): any {\n if (options.store instanceof JsonEntityStore) {\n if (options.store.parameter && options.store.parameter.nestedGenerics.length) {\n options.nestedGenerics = options.store.parameter.nestedGenerics;\n }\n\n options.type = options.store.computedType;\n options.collectionType = options.store.collectionType;\n options.store = undefined;\n }\n\n return {\n groups: false,\n useAlias: true,\n ...options,\n type: options.type ? options.type : undefined,\n types: options.types ? options.types : getJsonMapperTypes()\n };\n}\n\n/**\n * Transform given source to class base on the given `options.type`.\n *\n * @param src\n * @param options\n */\nexport function deserialize<T = any>(src: any, options: JsonDeserializerOptions = {}): T {\n options = buildOptions(options);\n\n if (!isDeserializable(src, options)) {\n return src;\n }\n\n if (!options.collectionType && isArray(src)) {\n options.collectionType = Array;\n }\n\n if (options.collectionType) {\n if (!options.types?.has(options.collectionType)) {\n throw new Error(`${nameOf(options.collectionType)} is not supported by JsonMapper.`);\n }\n\n return transformCollection(src, options);\n }\n\n if (options.types?.has(options.type)) {\n return transformType(src, options);\n }\n\n // class converter\n return plainObjectToClass(src, options);\n}\n"]}
@@ -1,8 +1,13 @@
1
- import { classOf, isArray, isClassObject, isCollection, isEmpty, isFunction, isNil, objectKeys } from "@tsed/core";
1
+ import { classOf, isArray, isClassObject, isCollection, isDate, isEmpty, isFunction, isNil, nameOf, objectKeys } from "@tsed/core";
2
2
  import { alterIgnore, getPropertiesStores, JsonEntityStore } from "@tsed/schema";
3
- import "../components";
4
- import { JsonMapperContext } from "../domain/JsonMapperContext";
5
- import { getJsonMapperTypes } from "../domain/JsonMapperTypesContainer";
3
+ import "../components/ArrayMapper.js";
4
+ import "../components/DateMapper.js";
5
+ import "../components/MapMapper.js";
6
+ import "../components/PrimitiveMapper.js";
7
+ import "../components/SetMapper.js";
8
+ import "../components/SymbolMapper.js";
9
+ import { JsonMapperContext } from "../domain/JsonMapperContext.js";
10
+ import { getJsonMapperTypes } from "../domain/JsonMapperTypesContainer.js";
6
11
  function alterValue(schema, value, options) {
7
12
  return schema.$hooks.alter("onSerialize", value, [options]);
8
13
  }
@@ -29,7 +34,11 @@ function getType(propStore, value) {
29
34
  export function classToPlainObject(obj, options) {
30
35
  const { useAlias = true, type, ...props } = options;
31
36
  const entity = JsonEntityStore.from(type || obj);
32
- return getSchemaProperties(entity, obj).reduce((newObj, [key, propStore]) => {
37
+ const additionalProperties = !!entity.schema.get("additionalProperties");
38
+ const schemaProperties = getSchemaProperties(entity, obj);
39
+ const properties = new Set();
40
+ const out = schemaProperties.reduce((newObj, [key, propStore]) => {
41
+ properties.add(key);
33
42
  const schema = propStore.schema;
34
43
  if (alterIgnore(schema, { useAlias, ...props, self: obj })) {
35
44
  return newObj;
@@ -37,6 +46,7 @@ export function classToPlainObject(obj, options) {
37
46
  let value = alterValue(schema, obj[key], { useAlias, ...props, self: obj });
38
47
  value = serialize(value, {
39
48
  useAlias,
49
+ self: obj,
40
50
  type: value === obj[key] ? getType(propStore, value) : undefined,
41
51
  collectionType: propStore.collectionType,
42
52
  ...props
@@ -50,6 +60,14 @@ export function classToPlainObject(obj, options) {
50
60
  [key]: value
51
61
  };
52
62
  }, {});
63
+ if (additionalProperties) {
64
+ objectKeys(obj).forEach((key) => {
65
+ if (!properties.has(key)) {
66
+ out[key] = obj[key];
67
+ }
68
+ });
69
+ }
70
+ return out;
53
71
  }
54
72
  function toObject(obj, options) {
55
73
  return getObjectProperties(obj).reduce((newObj, [key, value]) => ({
@@ -64,8 +82,16 @@ function getBestType(type, obj) {
64
82
  }
65
83
  return type || Object;
66
84
  }
85
+ function hasJsonMethod(obj) {
86
+ return typeof obj.toJSON === "function";
87
+ }
88
+ function isMongooseObject(obj) {
89
+ return (hasJsonMethod(obj) && obj.$isMongooseModelPrototype) || obj._bsontype;
90
+ }
91
+ function isMomentObject(obj) {
92
+ return obj && obj?._isAMomentObject;
93
+ }
67
94
  export function serialize(obj, { type, collectionType, groups = false, ...options } = {}) {
68
- var _a;
69
95
  if (isEmpty(obj)) {
70
96
  return obj;
71
97
  }
@@ -73,10 +99,10 @@ export function serialize(obj, { type, collectionType, groups = false, ...option
73
99
  const types = options.types ? options.types : getJsonMapperTypes();
74
100
  options.groups = groups;
75
101
  // FIX custom serialization function from @tsed/mongoose and bson
76
- if ((typeof obj.toJSON === "function" && obj.$isMongooseModelPrototype) || obj._bsontype) {
102
+ if (isMongooseObject(obj)) {
77
103
  return obj.toJSON(options);
78
104
  }
79
- if (typeof obj.toJSON === "function") {
105
+ if (hasJsonMethod(obj) && !isMomentObject(obj) && !isDate(obj)) {
80
106
  return serialize(obj.toJSON(), { ...options, type: classOf(obj) });
81
107
  }
82
108
  if (!isCollection(obj)) {
@@ -96,13 +122,17 @@ export function serialize(obj, { type, collectionType, groups = false, ...option
96
122
  type: options.type
97
123
  })
98
124
  });
99
- if (types.has(currentType)) {
100
- const jsonMapper = types.get(currentType);
125
+ const mapper = types.get(currentType) || types.get(nameOf(currentType));
126
+ if (mapper) {
127
+ const jsonMapper = mapper;
101
128
  return jsonMapper.serialize(obj, context);
102
129
  }
130
+ else if (obj?._isAMomentObject) {
131
+ return obj.toJSON();
132
+ }
103
133
  if (isArray(obj)) {
104
134
  // Serialize Array class like
105
- return (_a = types.get(Array)) === null || _a === void 0 ? void 0 : _a.serialize(obj, context);
135
+ return types.get(Array)?.serialize(obj, context);
106
136
  }
107
137
  return !isClassObject(currentType) ? classToPlainObject(obj, options) : toObject(obj, options);
108
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../../src/utils/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAiB,UAAU,EAAO,MAAM,YAAY,CAAC;AACtI,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,cAAc,CAAC;AAC5G,OAAO,eAAe,CAAC;AACvB,OAAO,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAC,kBAAkB,EAAC,MAAM,oCAAoC,CAAC;AAgBtE,SAAS,UAAU,CAAC,MAAkB,EAAE,KAAU,EAAE,OAAwB;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA2B,EAAE,GAAQ;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAClB,8CAA8C;QAC9C,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAQ;IACnC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,OAAO,CAAC,SAA0B,EAAE,KAAU;IACrD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAC7E,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,OAAwC;IACnF,MAAM,EAAC,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAC,GAAG,OAAO,CAAC;IAElD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEjD,OAAO,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE;QAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,IAAI,WAAW,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,EAAC,CAAC,EAAE;YACxD,OAAO,MAAM,CAAC;SACf;QAED,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC;QAC1E,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;YACvB,QAAQ;YACR,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,GAAG,KAAK;SACT,CAAC,CAAC;QAEH,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,OAAO,MAAM,CAAC;SACf;QAED,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEtE,OAAO;YACL,GAAG,MAAM;YACT,CAAC,GAAG,CAAC,EAAE,KAAK;SACb,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,QAAQ,CAAC,GAAQ,EAAE,OAA8B;IACxD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,CACpC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,GAAG,MAAM;QACT,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;KACjC,CAAC,EACF,EAAE,CACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAe,EAAE,GAAQ;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;QACxC,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAQ,EAAE,EAAC,IAAI,EAAE,cAAc,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,KAA2B,EAAE;;IAChH,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAChB,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACnE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAExB,iEAAiE;IACjE,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE;QACxF,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC5B;IAED,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE;QACpC,OAAO,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAC,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAAC,CAAC,CAAC;KAClE;IAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,CAAC,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;KAC5D;SAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;QAClC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,cAAc,GAAG,WAAW,CAAC;KACtC;IAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;QACpC,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,SAAS,CAAC,IAAI,EAAE;YACd,GAAG,OAAO;YACV,cAAc,EAAE,SAAS;YACzB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;KACL,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;QAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;QAE3C,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;KAC3C;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAChB,6BAA6B;QAC7B,OAAO,MAAA,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;KAClD;IAED,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjG,CAAC","sourcesContent":["import {classOf, isArray, isClassObject, isCollection, isEmpty, isFunction, isNil, MetadataTypes, objectKeys, Type} from \"@tsed/core\";\nimport {alterIgnore, getPropertiesStores, JsonEntityStore, JsonHookContext, JsonSchema} from \"@tsed/schema\";\nimport \"../components\";\nimport {JsonMapperContext} from \"../domain/JsonMapperContext\";\nimport {getJsonMapperTypes} from \"../domain/JsonMapperTypesContainer\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n\nexport interface JsonSerializerOptions<T = any, C = any> extends MetadataTypes<T, C> {\n /**\n * Types used to map complex types (Symbol, Array, Set, Map)\n */\n types?: Map<Type<any>, JsonMapperMethods>;\n /**\n * useAlias mapping\n */\n useAlias?: boolean;\n\n [key: string]: any;\n}\n\nfunction alterValue(schema: JsonSchema, value: any, options: JsonHookContext) {\n return schema.$hooks.alter(\"onSerialize\", value, [options]);\n}\n\nfunction getSchemaProperties(storedJson: JsonEntityStore, obj: any) {\n const stores = Array.from(getPropertiesStores(storedJson).entries());\n\n if (!stores.length) {\n // fallback to auto discovering field from obj\n objectKeys(obj).forEach((key) => {\n const propStore = JsonEntityStore.from(storedJson.target, key);\n stores.push([key, propStore]);\n });\n }\n\n return stores;\n}\n\nfunction getObjectProperties(obj: any): [string, any][] {\n return Object.entries(obj).filter(([, value]) => !isFunction(value));\n}\n\nfunction getType(propStore: JsonEntityStore, value: any) {\n if (isNil(value) || propStore.type === Object || isCollection(propStore.type)) {\n return undefined;\n }\n\n return propStore.type;\n}\n\nexport function classToPlainObject(obj: any, options: JsonSerializerOptions<any, any>) {\n const {useAlias = true, type, ...props} = options;\n\n const entity = JsonEntityStore.from(type || obj);\n\n return getSchemaProperties(entity, obj).reduce((newObj, [key, propStore]) => {\n const schema = propStore.schema;\n\n if (alterIgnore(schema, {useAlias, ...props, self: obj})) {\n return newObj;\n }\n\n let value = alterValue(schema, obj[key], {useAlias, ...props, self: obj});\n value = serialize(value, {\n useAlias,\n type: value === obj[key] ? getType(propStore, value) : undefined,\n collectionType: propStore.collectionType,\n ...props\n });\n\n if (value === undefined) {\n return newObj;\n }\n\n key = useAlias ? propStore.parent.schema.getAliasOf(key) || key : key;\n\n return {\n ...newObj,\n [key]: value\n };\n }, {});\n}\n\nfunction toObject(obj: any, options: JsonSerializerOptions): any {\n return getObjectProperties(obj).reduce(\n (newObj, [key, value]) => ({\n ...newObj,\n [key]: serialize(value, options)\n }),\n {}\n );\n}\n\nfunction getBestType(type: Type<any>, obj: any) {\n const dataType = classOf(obj);\n\n if (dataType && !isClassObject(dataType)) {\n return dataType;\n }\n\n return type || Object;\n}\n\nexport function serialize(obj: any, {type, collectionType, groups = false, ...options}: JsonSerializerOptions = {}): any {\n if (isEmpty(obj)) {\n return obj;\n }\n\n let currentType = type;\n\n const types = options.types ? options.types : getJsonMapperTypes();\n options.groups = groups;\n\n // FIX custom serialization function from @tsed/mongoose and bson\n if ((typeof obj.toJSON === \"function\" && obj.$isMongooseModelPrototype) || obj._bsontype) {\n return obj.toJSON(options);\n }\n\n if (typeof obj.toJSON === \"function\") {\n return serialize(obj.toJSON(), {...options, type: classOf(obj)});\n }\n\n if (!isCollection(obj)) {\n options.type = currentType = getBestType(currentType, obj);\n } else if (!options.collectionType) {\n currentType = classOf(obj);\n options.type = type;\n options.collectionType = currentType;\n }\n\n const context = new JsonMapperContext({\n type: currentType,\n options,\n next: (data) =>\n serialize(data, {\n ...options,\n collectionType: undefined,\n type: options.type\n })\n });\n\n if (types.has(currentType)) {\n const jsonMapper = types.get(currentType)!;\n\n return jsonMapper.serialize(obj, context);\n }\n\n if (isArray(obj)) {\n // Serialize Array class like\n return types.get(Array)?.serialize(obj, context);\n }\n\n return !isClassObject(currentType) ? classToPlainObject(obj, options) : toObject(obj, options);\n}\n"]}
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../../src/utils/serialize.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classOf,\n isArray,\n isClassObject,\n isCollection,\n isDate,\n isEmpty,\n isFunction,\n isNil,\n MetadataTypes,\n nameOf,\n objectKeys,\n Type\n} from \"@tsed/core\";\nimport {alterIgnore, getPropertiesStores, JsonEntityStore, JsonHookContext, JsonSchema} from \"@tsed/schema\";\nimport \"../components/ArrayMapper\";\nimport \"../components/DateMapper\";\nimport \"../components/MapMapper\";\nimport \"../components/PrimitiveMapper\";\nimport \"../components/SetMapper\";\nimport \"../components/SymbolMapper\";\nimport {JsonMapperContext} from \"../domain/JsonMapperContext\";\nimport {getJsonMapperTypes} from \"../domain/JsonMapperTypesContainer\";\nimport {JsonMapperMethods} from \"../interfaces/JsonMapperMethods\";\n\nexport interface JsonSerializerOptions<T = any, C = any> extends MetadataTypes<T, C> {\n /**\n * Types used to map complex types (Symbol, Array, Set, Map)\n */\n types?: Map<Type<any>, JsonMapperMethods>;\n /**\n * useAlias mapping\n */\n useAlias?: boolean;\n\n [key: string]: any;\n}\n\nfunction alterValue(schema: JsonSchema, value: any, options: JsonHookContext) {\n return schema.$hooks.alter(\"onSerialize\", value, [options]);\n}\n\nfunction getSchemaProperties(storedJson: JsonEntityStore, obj: any) {\n const stores = Array.from(getPropertiesStores(storedJson).entries());\n\n if (!stores.length) {\n // fallback to auto discovering field from obj\n objectKeys(obj).forEach((key) => {\n const propStore = JsonEntityStore.from(storedJson.target, key);\n stores.push([key, propStore]);\n });\n }\n\n return stores;\n}\n\nfunction getObjectProperties(obj: any): [string, any][] {\n return Object.entries(obj).filter(([, value]) => !isFunction(value));\n}\n\nfunction getType(propStore: JsonEntityStore, value: any) {\n if (isNil(value) || propStore.type === Object || isCollection(propStore.type)) {\n return undefined;\n }\n\n return propStore.type;\n}\n\nexport function classToPlainObject(obj: any, options: JsonSerializerOptions<any, any>) {\n const {useAlias = true, type, ...props} = options;\n\n const entity = JsonEntityStore.from(type || obj);\n\n const additionalProperties = !!entity.schema.get(\"additionalProperties\");\n const schemaProperties = getSchemaProperties(entity, obj);\n const properties = new Set<string>();\n const out: any = schemaProperties.reduce((newObj, [key, propStore]) => {\n properties.add(key as string);\n\n const schema = propStore.schema;\n\n if (alterIgnore(schema, {useAlias, ...props, self: obj})) {\n return newObj;\n }\n\n let value = alterValue(schema, obj[key], {useAlias, ...props, self: obj});\n\n value = serialize(value, {\n useAlias,\n self: obj,\n type: value === obj[key] ? getType(propStore, value) : undefined,\n collectionType: propStore.collectionType,\n ...props\n });\n\n if (value === undefined) {\n return newObj;\n }\n\n key = useAlias ? propStore.parent.schema.getAliasOf(key) || key : key;\n\n return {\n ...newObj,\n [key]: value\n };\n }, {});\n\n if (additionalProperties) {\n objectKeys(obj).forEach((key: any) => {\n if (!properties.has(key)) {\n out[key] = obj[key];\n }\n });\n }\n return out;\n}\n\nfunction toObject(obj: any, options: JsonSerializerOptions): any {\n return getObjectProperties(obj).reduce(\n (newObj, [key, value]) => ({\n ...newObj,\n [key]: serialize(value, options)\n }),\n {}\n );\n}\n\nfunction getBestType(type: Type<any>, obj: any) {\n const dataType = classOf(obj);\n\n if (dataType && !isClassObject(dataType)) {\n return dataType;\n }\n\n return type || Object;\n}\n\nfunction hasJsonMethod(obj: any) {\n return typeof obj.toJSON === \"function\";\n}\n\nfunction isMongooseObject(obj: any) {\n return (hasJsonMethod(obj) && obj.$isMongooseModelPrototype) || obj._bsontype;\n}\n\nfunction isMomentObject(obj: any) {\n return obj && obj?._isAMomentObject;\n}\n\nexport function serialize(obj: any, {type, collectionType, groups = false, ...options}: JsonSerializerOptions = {}): any {\n if (isEmpty(obj)) {\n return obj;\n }\n\n let currentType = type;\n\n const types = options.types ? options.types : getJsonMapperTypes();\n options.groups = groups;\n\n // FIX custom serialization function from @tsed/mongoose and bson\n if (isMongooseObject(obj)) {\n return obj.toJSON(options);\n }\n\n if (hasJsonMethod(obj) && !isMomentObject(obj) && !isDate(obj)) {\n return serialize(obj.toJSON(), {...options, type: classOf(obj)});\n }\n\n if (!isCollection(obj)) {\n options.type = currentType = getBestType(currentType, obj);\n } else if (!options.collectionType) {\n currentType = classOf(obj);\n options.type = type;\n options.collectionType = currentType;\n }\n\n const context = new JsonMapperContext({\n type: currentType,\n options,\n next: (data) =>\n serialize(data, {\n ...options,\n collectionType: undefined,\n type: options.type\n })\n });\n\n const mapper = types.get(currentType) || types.get(nameOf(currentType));\n\n if (mapper) {\n const jsonMapper = mapper!;\n\n return jsonMapper.serialize(obj, context);\n } else if (obj?._isAMomentObject) {\n return obj.toJSON();\n }\n\n if (isArray(obj)) {\n // Serialize Array class like\n return types.get(Array)?.serialize(obj, context);\n }\n\n return !isClassObject(currentType) ? classToPlainObject(obj, options) : toObject(obj, options);\n}\n"]}
@@ -3,8 +3,8 @@ import { JsonMapperMethods } from "../interfaces/JsonMapperMethods";
3
3
  /**
4
4
  * @ignore
5
5
  */
6
- export declare function registerJsonTypeMapper(type: Type<any>, token: Type<JsonMapperMethods>): void;
6
+ export declare function registerJsonTypeMapper(type: Type<any> | Symbol | string, token: Type<JsonMapperMethods>): void;
7
7
  /**
8
8
  * @ignore
9
9
  */
10
- export declare function getJsonMapperTypes(): WeakMap<Type<any> | Symbol, JsonMapperMethods>;
10
+ export declare function getJsonMapperTypes(): Map<Type<any> | Symbol | string, JsonMapperMethods>;
@@ -1,11 +1,21 @@
1
- export * from "./components";
1
+ /**
2
+ * @file Automatically generated by barrelsby.
3
+ */
4
+ export * from "./components/ArrayMapper";
5
+ export * from "./components/DateMapper";
6
+ export * from "./components/MapMapper";
7
+ export * from "./components/PrimitiveMapper";
8
+ export * from "./components/SetMapper";
9
+ export * from "./components/SymbolMapper";
10
+ export * from "./decorators/afterDeserialize";
11
+ export * from "./decorators/beforeDeserialize";
2
12
  export * from "./decorators/jsonMapper";
3
13
  export * from "./decorators/onDeserialize";
4
14
  export * from "./decorators/onSerialize";
5
- export * from "./decorators/afterDeserialize";
6
- export * from "./decorators/beforeDeserialize";
7
15
  export * from "./domain/JsonMapperContext";
8
16
  export * from "./domain/JsonMapperTypesContainer";
17
+ export * from "./hooks/alterAfterDeserialize";
18
+ export * from "./hooks/alterBeforeDeserialize";
9
19
  export * from "./interfaces/JsonMapperMethods";
10
20
  export * from "./utils/deserialize";
11
21
  export * from "./utils/serialize";
@@ -1,6 +1,11 @@
1
1
  import { MetadataTypes, Type } from "@tsed/core";
2
2
  import { JsonEntityStore } from "@tsed/schema";
3
- import "../components";
3
+ import "../components/ArrayMapper";
4
+ import "../components/DateMapper";
5
+ import "../components/MapMapper";
6
+ import "../components/PrimitiveMapper";
7
+ import "../components/SetMapper";
8
+ import "../components/SymbolMapper";
4
9
  import { JsonMapperMethods } from "../interfaces/JsonMapperMethods";
5
10
  export interface JsonDeserializerOptions<T = any, C = any> extends MetadataTypes<T, C> {
6
11
  /**
@@ -1,5 +1,10 @@
1
1
  import { MetadataTypes, Type } from "@tsed/core";
2
- import "../components";
2
+ import "../components/ArrayMapper";
3
+ import "../components/DateMapper";
4
+ import "../components/MapMapper";
5
+ import "../components/PrimitiveMapper";
6
+ import "../components/SetMapper";
7
+ import "../components/SymbolMapper";
3
8
  import { JsonMapperMethods } from "../interfaces/JsonMapperMethods";
4
9
  export interface JsonSerializerOptions<T = any, C = any> extends MetadataTypes<T, C> {
5
10
  /**
@@ -12,5 +17,5 @@ export interface JsonSerializerOptions<T = any, C = any> extends MetadataTypes<T
12
17
  useAlias?: boolean;
13
18
  [key: string]: any;
14
19
  }
15
- export declare function classToPlainObject(obj: any, options: JsonSerializerOptions<any, any>): {};
20
+ export declare function classToPlainObject(obj: any, options: JsonSerializerOptions<any, any>): any;
16
21
  export declare function serialize(obj: any, { type, collectionType, groups, ...options }?: JsonSerializerOptions): any;