@tsed/json-mapper 7.7.0 → 7.8.0

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.
@@ -42,26 +42,6 @@ function transformType(src, options) {
42
42
  });
43
43
  return types?.get(type)?.deserialize(src, context);
44
44
  }
45
- function mapItemOptions(propStore, options) {
46
- const itemOpts = {
47
- ...options,
48
- store: undefined,
49
- type: propStore.computedType
50
- };
51
- if (propStore.schema.hasGenerics) {
52
- itemOpts.nestedGenerics = propStore.schema.nestedGenerics;
53
- }
54
- else if (propStore.schema.isGeneric && options.nestedGenerics) {
55
- const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
56
- const genericLabels = propStore.parent.schema.genericLabels || [];
57
- itemOpts.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;
58
- if (itemOpts.type instanceof schema_1.JsonSchema) {
59
- itemOpts.type = itemOpts.type.getTarget();
60
- }
61
- itemOpts.nestedGenerics = nestedGenerics;
62
- }
63
- return itemOpts;
64
- }
65
45
  function getAdditionalProperties(nbProps, store, options) {
66
46
  const additionalProperties = store.schema.get("additionalProperties");
67
47
  if ((0, core_1.isBoolean)(additionalProperties) || (0, core_1.isClass)(additionalProperties)) {
@@ -93,13 +73,15 @@ function plainObjectToClass(src, options) {
93
73
  return;
94
74
  }
95
75
  let value = alterValue(propStore.schema, src[key], { ...options, self: src });
96
- const itemOptions = mapItemOptions(propStore, options);
97
- value = deserialize(value, {
98
- ...itemOptions,
99
- self: src,
100
- type: value === src[key] ? itemOptions.type : undefined,
101
- collectionType: propStore.collectionType
102
- });
76
+ value =
77
+ value === src[key]
78
+ ? deserialize(value, {
79
+ ...options,
80
+ store: propStore,
81
+ self: src,
82
+ collectionType: propStore.collectionType
83
+ })
84
+ : value;
103
85
  if (!propStore.isGetterOnly()) {
104
86
  if (value !== undefined) {
105
87
  out[propStore.propertyName] = value;
@@ -128,15 +110,58 @@ function plainObjectToClass(src, options) {
128
110
  return (0, alterAfterDeserialize_1.alterAfterDeserialize)(out, store.schema, options);
129
111
  }
130
112
  exports.plainObjectToClass = plainObjectToClass;
113
+ function mapPropStoreOptions(store, options) {
114
+ const itemOpts = {
115
+ ...options,
116
+ store: undefined,
117
+ type: store.computedType
118
+ };
119
+ if (store.schema.isDiscriminator) {
120
+ itemOpts.type = store.schema.discriminator();
121
+ }
122
+ if (store.schema.hasGenerics) {
123
+ itemOpts.nestedGenerics = store.schema.nestedGenerics;
124
+ }
125
+ else if (store.schema.isGeneric && options.nestedGenerics) {
126
+ const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
127
+ const genericLabels = store.parent.schema.genericLabels || [];
128
+ itemOpts.type = genericTypes[genericLabels.indexOf(store.schema.genericType)] || Object;
129
+ if (itemOpts.type instanceof schema_1.JsonSchema) {
130
+ itemOpts.type = itemOpts.type.getTarget();
131
+ }
132
+ itemOpts.nestedGenerics = nestedGenerics;
133
+ }
134
+ return itemOpts;
135
+ }
136
+ function mapParamStoreOptions(store, options) {
137
+ return {
138
+ ...options,
139
+ store: undefined,
140
+ type: store.itemSchema.isDiscriminator ? store.itemSchema.discriminator() : store.type,
141
+ collectionType: store.collectionType,
142
+ groups: store.parameter.groups,
143
+ genericTypes: store.nestedGenerics[0],
144
+ nestedGenerics: store.nestedGenerics
145
+ };
146
+ }
131
147
  function buildOptions(options) {
148
+ if (options.store instanceof schema_1.JsonPropertyStore) {
149
+ return buildOptions(mapPropStoreOptions(options.store, options));
150
+ }
151
+ if (options.store instanceof schema_1.JsonParameterStore) {
152
+ return buildOptions(mapParamStoreOptions(options.store, options));
153
+ }
132
154
  if (options.store instanceof schema_1.JsonEntityStore) {
133
- if (options.store.parameter && options.store.parameter.nestedGenerics.length) {
134
- options.nestedGenerics = options.store.parameter.nestedGenerics;
135
- }
136
155
  options.type = options.store.computedType;
137
156
  options.collectionType = options.store.collectionType;
138
157
  options.store = undefined;
139
158
  }
159
+ else if ((0, core_1.isClass)(options.type)) {
160
+ const store = schema_1.JsonEntityStore.from(options.type);
161
+ if (store.schema.isDiscriminator) {
162
+ options.type = schema_1.JsonEntityStore.from(options.type).schema.discriminator();
163
+ }
164
+ }
140
165
  return {
141
166
  groups: false,
142
167
  useAlias: true,
@@ -171,6 +196,12 @@ function deserialize(src, options = {}) {
171
196
  if (options.types?.has(options.type)) {
172
197
  return transformType(src, options);
173
198
  }
199
+ if (options.type instanceof schema_1.Discriminator) {
200
+ const discriminator = options.type;
201
+ const discriminatorValue = src[discriminator.propertyName];
202
+ const type = discriminator.getType(discriminatorValue);
203
+ return plainObjectToClass(src, { ...options, type });
204
+ }
174
205
  // class converter
175
206
  return plainObjectToClass(src, options);
176
207
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../../src/utils/deserialize.ts"],"names":[],"mappings":"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","sourcesContent":["import {getValue, isArray, isBoolean, isClass, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {alterIgnore, getProperties, 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 {JsonMapperSettings} from \"../domain/JsonMapperSettings\";\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 *\n */\n disableUnsecureConstructor?: 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(options.disableUnsecureConstructor ? {} : 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 (!propStore.isGetterOnly()) {\n if (value !== undefined) {\n out[propStore.propertyName] = value;\n } else if (options.partial) {\n delete out[propStore.propertyName];\n }\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 additionalProperties: getValue(options, \"additionalProperties\", JsonMapperSettings.additionalProperties),\n disableUnsecureConstructor: getValue(options, \"disableUnsecureConstructor\", JsonMapperSettings.disableUnsecureConstructor),\n partial: options.groups ? options.groups.includes(\"partial\") : false,\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 {getValue, isArray, isBoolean, isClass, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {\n alterIgnore,\n Discriminator,\n getProperties,\n JsonEntityStore,\n JsonHookContext,\n JsonParameterStore,\n JsonPropertyStore,\n JsonSchema\n} 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 {JsonMapperSettings} from \"../domain/JsonMapperSettings\";\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 *\n */\n disableUnsecureConstructor?: 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 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\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(options.disableUnsecureConstructor ? {} : 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 value =\n value === src[key]\n ? deserialize(value, {\n ...options,\n store: propStore,\n self: src,\n collectionType: propStore.collectionType\n })\n : value;\n\n if (!propStore.isGetterOnly()) {\n if (value !== undefined) {\n out[propStore.propertyName] = value;\n } else if (options.partial) {\n delete out[propStore.propertyName];\n }\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 mapPropStoreOptions(store: JsonPropertyStore, options: JsonDeserializerOptions) {\n const itemOpts: JsonDeserializerOptions = {\n ...options,\n store: undefined,\n type: store.computedType\n };\n\n if (store.schema.isDiscriminator) {\n itemOpts.type = store.schema.discriminator();\n }\n\n if (store.schema.hasGenerics) {\n itemOpts.nestedGenerics = store.schema.nestedGenerics;\n } else if (store.schema.isGeneric && options.nestedGenerics) {\n const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;\n const genericLabels = store.parent.schema.genericLabels || [];\n\n itemOpts.type = genericTypes[genericLabels.indexOf(store.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 mapParamStoreOptions(store: JsonParameterStore, options: JsonDeserializerOptions) {\n return {\n ...options,\n store: undefined,\n type: store.itemSchema.isDiscriminator ? store.itemSchema.discriminator() : store.type,\n collectionType: store.collectionType,\n groups: store.parameter.groups,\n genericTypes: store.nestedGenerics[0],\n nestedGenerics: store.nestedGenerics\n };\n}\n\nfunction buildOptions(options: JsonDeserializerOptions<any, any>): any {\n if (options.store instanceof JsonPropertyStore) {\n return buildOptions(mapPropStoreOptions(options.store, options));\n }\n\n if (options.store instanceof JsonParameterStore) {\n return buildOptions(mapParamStoreOptions(options.store, options));\n }\n\n if (options.store instanceof JsonEntityStore) {\n options.type = options.store.computedType;\n options.collectionType = options.store.collectionType;\n options.store = undefined;\n } else if (isClass(options.type)) {\n const store = JsonEntityStore.from(options.type);\n if (store.schema.isDiscriminator) {\n options.type = JsonEntityStore.from(options.type).schema.discriminator();\n }\n }\n\n return {\n groups: false,\n useAlias: true,\n ...options,\n additionalProperties: getValue(options, \"additionalProperties\", JsonMapperSettings.additionalProperties),\n disableUnsecureConstructor: getValue(options, \"disableUnsecureConstructor\", JsonMapperSettings.disableUnsecureConstructor),\n partial: options.groups ? options.groups.includes(\"partial\") : false,\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 if (options.type instanceof Discriminator) {\n const discriminator = options.type;\n const discriminatorValue = src[discriminator.propertyName];\n const type = discriminator.getType(discriminatorValue);\n\n return plainObjectToClass(src, {...options, type});\n }\n\n // class converter\n return plainObjectToClass(src, options);\n}\n"]}
@@ -63,6 +63,12 @@ function classToPlainObject(obj, options) {
63
63
  [key]: value
64
64
  };
65
65
  }, {});
66
+ if (entity.ancestor?.schema.isDiscriminator) {
67
+ const discriminator = entity.ancestor.schema.discriminator();
68
+ if (!out[discriminator.propertyName]) {
69
+ out[discriminator.propertyName] = discriminator.getDefaultValue(entity.target);
70
+ }
71
+ }
66
72
  if (additionalProperties) {
67
73
  (0, core_1.objectKeys)(obj).forEach((key) => {
68
74
  if (!properties.has(key)) {
@@ -1 +1 @@
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"]}
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\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 (entity.ancestor?.schema.isDiscriminator) {\n const discriminator = entity.ancestor.schema.discriminator();\n\n if (!out[discriminator.propertyName]) {\n out[discriminator.propertyName] = discriminator.getDefaultValue(entity.target);\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"]}
@@ -1,5 +1,5 @@
1
1
  import { getValue, isArray, isBoolean, isClass, isEmpty, isNil, nameOf, objectKeys } from "@tsed/core";
2
- import { alterIgnore, getProperties, JsonEntityStore, JsonSchema } from "@tsed/schema";
2
+ import { alterIgnore, Discriminator, getProperties, JsonEntityStore, JsonParameterStore, JsonPropertyStore, JsonSchema } from "@tsed/schema";
3
3
  import "../components/ArrayMapper.js";
4
4
  import "../components/DateMapper.js";
5
5
  import "../components/MapMapper.js";
@@ -39,26 +39,6 @@ function transformType(src, options) {
39
39
  });
40
40
  return types?.get(type)?.deserialize(src, context);
41
41
  }
42
- function mapItemOptions(propStore, options) {
43
- const itemOpts = {
44
- ...options,
45
- store: undefined,
46
- type: propStore.computedType
47
- };
48
- if (propStore.schema.hasGenerics) {
49
- itemOpts.nestedGenerics = propStore.schema.nestedGenerics;
50
- }
51
- else if (propStore.schema.isGeneric && options.nestedGenerics) {
52
- const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
53
- const genericLabels = propStore.parent.schema.genericLabels || [];
54
- itemOpts.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;
55
- if (itemOpts.type instanceof JsonSchema) {
56
- itemOpts.type = itemOpts.type.getTarget();
57
- }
58
- itemOpts.nestedGenerics = nestedGenerics;
59
- }
60
- return itemOpts;
61
- }
62
42
  function getAdditionalProperties(nbProps, store, options) {
63
43
  const additionalProperties = store.schema.get("additionalProperties");
64
44
  if (isBoolean(additionalProperties) || isClass(additionalProperties)) {
@@ -90,13 +70,15 @@ export function plainObjectToClass(src, options) {
90
70
  return;
91
71
  }
92
72
  let value = alterValue(propStore.schema, src[key], { ...options, self: src });
93
- const itemOptions = mapItemOptions(propStore, options);
94
- value = deserialize(value, {
95
- ...itemOptions,
96
- self: src,
97
- type: value === src[key] ? itemOptions.type : undefined,
98
- collectionType: propStore.collectionType
99
- });
73
+ value =
74
+ value === src[key]
75
+ ? deserialize(value, {
76
+ ...options,
77
+ store: propStore,
78
+ self: src,
79
+ collectionType: propStore.collectionType
80
+ })
81
+ : value;
100
82
  if (!propStore.isGetterOnly()) {
101
83
  if (value !== undefined) {
102
84
  out[propStore.propertyName] = value;
@@ -124,15 +106,58 @@ export function plainObjectToClass(src, options) {
124
106
  }
125
107
  return alterAfterDeserialize(out, store.schema, options);
126
108
  }
109
+ function mapPropStoreOptions(store, options) {
110
+ const itemOpts = {
111
+ ...options,
112
+ store: undefined,
113
+ type: store.computedType
114
+ };
115
+ if (store.schema.isDiscriminator) {
116
+ itemOpts.type = store.schema.discriminator();
117
+ }
118
+ if (store.schema.hasGenerics) {
119
+ itemOpts.nestedGenerics = store.schema.nestedGenerics;
120
+ }
121
+ else if (store.schema.isGeneric && options.nestedGenerics) {
122
+ const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
123
+ const genericLabels = store.parent.schema.genericLabels || [];
124
+ itemOpts.type = genericTypes[genericLabels.indexOf(store.schema.genericType)] || Object;
125
+ if (itemOpts.type instanceof JsonSchema) {
126
+ itemOpts.type = itemOpts.type.getTarget();
127
+ }
128
+ itemOpts.nestedGenerics = nestedGenerics;
129
+ }
130
+ return itemOpts;
131
+ }
132
+ function mapParamStoreOptions(store, options) {
133
+ return {
134
+ ...options,
135
+ store: undefined,
136
+ type: store.itemSchema.isDiscriminator ? store.itemSchema.discriminator() : store.type,
137
+ collectionType: store.collectionType,
138
+ groups: store.parameter.groups,
139
+ genericTypes: store.nestedGenerics[0],
140
+ nestedGenerics: store.nestedGenerics
141
+ };
142
+ }
127
143
  function buildOptions(options) {
144
+ if (options.store instanceof JsonPropertyStore) {
145
+ return buildOptions(mapPropStoreOptions(options.store, options));
146
+ }
147
+ if (options.store instanceof JsonParameterStore) {
148
+ return buildOptions(mapParamStoreOptions(options.store, options));
149
+ }
128
150
  if (options.store instanceof JsonEntityStore) {
129
- if (options.store.parameter && options.store.parameter.nestedGenerics.length) {
130
- options.nestedGenerics = options.store.parameter.nestedGenerics;
131
- }
132
151
  options.type = options.store.computedType;
133
152
  options.collectionType = options.store.collectionType;
134
153
  options.store = undefined;
135
154
  }
155
+ else if (isClass(options.type)) {
156
+ const store = JsonEntityStore.from(options.type);
157
+ if (store.schema.isDiscriminator) {
158
+ options.type = JsonEntityStore.from(options.type).schema.discriminator();
159
+ }
160
+ }
136
161
  return {
137
162
  groups: false,
138
163
  useAlias: true,
@@ -167,6 +192,12 @@ export function deserialize(src, options = {}) {
167
192
  if (options.types?.has(options.type)) {
168
193
  return transformType(src, options);
169
194
  }
195
+ if (options.type instanceof Discriminator) {
196
+ const discriminator = options.type;
197
+ const discriminatorValue = src[discriminator.propertyName];
198
+ const type = discriminator.getType(discriminatorValue);
199
+ return plainObjectToClass(src, { ...options, type });
200
+ }
170
201
  // class converter
171
202
  return plainObjectToClass(src, options);
172
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../../src/utils/deserialize.ts"],"names":[],"mappings":"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","sourcesContent":["import {getValue, isArray, isBoolean, isClass, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {alterIgnore, getProperties, 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 {JsonMapperSettings} from \"../domain/JsonMapperSettings\";\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 *\n */\n disableUnsecureConstructor?: 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(options.disableUnsecureConstructor ? {} : 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 (!propStore.isGetterOnly()) {\n if (value !== undefined) {\n out[propStore.propertyName] = value;\n } else if (options.partial) {\n delete out[propStore.propertyName];\n }\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 additionalProperties: getValue(options, \"additionalProperties\", JsonMapperSettings.additionalProperties),\n disableUnsecureConstructor: getValue(options, \"disableUnsecureConstructor\", JsonMapperSettings.disableUnsecureConstructor),\n partial: options.groups ? options.groups.includes(\"partial\") : false,\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 {getValue, isArray, isBoolean, isClass, isEmpty, isNil, MetadataTypes, nameOf, objectKeys, Type} from \"@tsed/core\";\nimport {\n alterIgnore,\n Discriminator,\n getProperties,\n JsonEntityStore,\n JsonHookContext,\n JsonParameterStore,\n JsonPropertyStore,\n JsonSchema\n} 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 {JsonMapperSettings} from \"../domain/JsonMapperSettings\";\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 *\n */\n disableUnsecureConstructor?: 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 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\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(options.disableUnsecureConstructor ? {} : 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 value =\n value === src[key]\n ? deserialize(value, {\n ...options,\n store: propStore,\n self: src,\n collectionType: propStore.collectionType\n })\n : value;\n\n if (!propStore.isGetterOnly()) {\n if (value !== undefined) {\n out[propStore.propertyName] = value;\n } else if (options.partial) {\n delete out[propStore.propertyName];\n }\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 mapPropStoreOptions(store: JsonPropertyStore, options: JsonDeserializerOptions) {\n const itemOpts: JsonDeserializerOptions = {\n ...options,\n store: undefined,\n type: store.computedType\n };\n\n if (store.schema.isDiscriminator) {\n itemOpts.type = store.schema.discriminator();\n }\n\n if (store.schema.hasGenerics) {\n itemOpts.nestedGenerics = store.schema.nestedGenerics;\n } else if (store.schema.isGeneric && options.nestedGenerics) {\n const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;\n const genericLabels = store.parent.schema.genericLabels || [];\n\n itemOpts.type = genericTypes[genericLabels.indexOf(store.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 mapParamStoreOptions(store: JsonParameterStore, options: JsonDeserializerOptions) {\n return {\n ...options,\n store: undefined,\n type: store.itemSchema.isDiscriminator ? store.itemSchema.discriminator() : store.type,\n collectionType: store.collectionType,\n groups: store.parameter.groups,\n genericTypes: store.nestedGenerics[0],\n nestedGenerics: store.nestedGenerics\n };\n}\n\nfunction buildOptions(options: JsonDeserializerOptions<any, any>): any {\n if (options.store instanceof JsonPropertyStore) {\n return buildOptions(mapPropStoreOptions(options.store, options));\n }\n\n if (options.store instanceof JsonParameterStore) {\n return buildOptions(mapParamStoreOptions(options.store, options));\n }\n\n if (options.store instanceof JsonEntityStore) {\n options.type = options.store.computedType;\n options.collectionType = options.store.collectionType;\n options.store = undefined;\n } else if (isClass(options.type)) {\n const store = JsonEntityStore.from(options.type);\n if (store.schema.isDiscriminator) {\n options.type = JsonEntityStore.from(options.type).schema.discriminator();\n }\n }\n\n return {\n groups: false,\n useAlias: true,\n ...options,\n additionalProperties: getValue(options, \"additionalProperties\", JsonMapperSettings.additionalProperties),\n disableUnsecureConstructor: getValue(options, \"disableUnsecureConstructor\", JsonMapperSettings.disableUnsecureConstructor),\n partial: options.groups ? options.groups.includes(\"partial\") : false,\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 if (options.type instanceof Discriminator) {\n const discriminator = options.type;\n const discriminatorValue = src[discriminator.propertyName];\n const type = discriminator.getType(discriminatorValue);\n\n return plainObjectToClass(src, {...options, type});\n }\n\n // class converter\n return plainObjectToClass(src, options);\n}\n"]}
@@ -60,6 +60,12 @@ export function classToPlainObject(obj, options) {
60
60
  [key]: value
61
61
  };
62
62
  }, {});
63
+ if (entity.ancestor?.schema.isDiscriminator) {
64
+ const discriminator = entity.ancestor.schema.discriminator();
65
+ if (!out[discriminator.propertyName]) {
66
+ out[discriminator.propertyName] = discriminator.getDefaultValue(entity.target);
67
+ }
68
+ }
63
69
  if (additionalProperties) {
64
70
  objectKeys(obj).forEach((key) => {
65
71
  if (!properties.has(key)) {
@@ -1 +1 @@
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"]}
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\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 (entity.ancestor?.schema.isDiscriminator) {\n const discriminator = entity.ancestor.schema.discriminator();\n\n if (!out[discriminator.propertyName]) {\n out[discriminator.propertyName] = discriminator.getDefaultValue(entity.target);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsed/json-mapper",
3
- "version": "7.7.0",
3
+ "version": "7.8.0",
4
4
  "description": "Json mapper module for Ts.ED Framework",
5
5
  "private": false,
6
6
  "source": "./src/index.ts",
@@ -36,14 +36,14 @@
36
36
  "tslib": "2.4.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@tsed/core": "7.7.0",
40
- "@tsed/exceptions": "7.7.0",
41
- "@tsed/schema": "7.7.0"
39
+ "@tsed/core": "7.8.0",
40
+ "@tsed/exceptions": "7.8.0",
41
+ "@tsed/schema": "7.8.0"
42
42
  },
43
43
  "peerDependencies": {
44
- "@tsed/core": "^7.7.0",
45
- "@tsed/exceptions": "^7.7.0",
46
- "@tsed/schema": "^7.7.0"
44
+ "@tsed/core": "^7.8.0",
45
+ "@tsed/exceptions": "^7.8.0",
46
+ "@tsed/schema": "^7.8.0"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
49
  "@tsed/core": {