@tsed/json-mapper 7.0.0-alpha.2 → 7.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/jest.config.js +14 -0
- package/lib/cjs/components/ArrayMapper.js +23 -0
- package/lib/cjs/components/ArrayMapper.js.map +1 -0
- package/lib/cjs/components/DateMapper.js +30 -0
- package/lib/cjs/components/DateMapper.js.map +1 -0
- package/lib/cjs/components/MapMapper.js +30 -0
- package/lib/cjs/components/MapMapper.js.map +1 -0
- package/lib/cjs/components/PrimitiveMapper.js +45 -0
- package/lib/cjs/components/PrimitiveMapper.js.map +1 -0
- package/lib/cjs/components/SetMapper.js +30 -0
- package/lib/cjs/components/SetMapper.js.map +1 -0
- package/lib/cjs/components/SymbolMapper.js +24 -0
- package/lib/cjs/components/SymbolMapper.js.map +1 -0
- package/lib/cjs/decorators/afterDeserialize.js +39 -0
- package/lib/cjs/decorators/afterDeserialize.js.map +1 -0
- package/lib/cjs/decorators/beforeDeserialize.js +39 -0
- package/lib/cjs/decorators/beforeDeserialize.js.map +1 -0
- package/lib/cjs/decorators/jsonMapper.js +18 -0
- package/lib/cjs/decorators/jsonMapper.js.map +1 -0
- package/lib/cjs/decorators/onDeserialize.js +29 -0
- package/lib/cjs/decorators/onDeserialize.js.map +1 -0
- package/lib/cjs/decorators/onSerialize.js +29 -0
- package/lib/cjs/decorators/onSerialize.js.map +1 -0
- package/lib/cjs/domain/JsonMapperContext.js +23 -0
- package/lib/cjs/domain/JsonMapperContext.js.map +1 -0
- package/lib/cjs/domain/JsonMapperTypesContainer.js +23 -0
- package/lib/cjs/domain/JsonMapperTypesContainer.js.map +1 -0
- package/lib/cjs/hooks/alterAfterDeserialize.js +9 -0
- package/lib/cjs/hooks/alterAfterDeserialize.js.map +1 -0
- package/lib/cjs/hooks/alterBeforeDeserialize.js +9 -0
- package/lib/cjs/hooks/alterBeforeDeserialize.js.map +1 -0
- package/lib/cjs/index.js +25 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/interfaces/JsonMapperMethods.js +3 -0
- package/lib/cjs/interfaces/JsonMapperMethods.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/utils/deserialize.js +154 -0
- package/lib/cjs/utils/deserialize.js.map +1 -0
- package/lib/cjs/utils/serialize.js +145 -0
- package/lib/cjs/utils/serialize.js.map +1 -0
- package/lib/esm/components/ArrayMapper.js +20 -0
- package/lib/esm/components/ArrayMapper.js.map +1 -0
- package/lib/esm/components/DateMapper.js +27 -0
- package/lib/esm/components/DateMapper.js.map +1 -0
- package/lib/esm/components/MapMapper.js +27 -0
- package/lib/esm/components/MapMapper.js.map +1 -0
- package/lib/esm/components/PrimitiveMapper.js +42 -0
- package/lib/esm/components/PrimitiveMapper.js.map +1 -0
- package/lib/esm/components/SetMapper.js +27 -0
- package/lib/esm/components/SetMapper.js.map +1 -0
- package/lib/esm/components/SymbolMapper.js +21 -0
- package/lib/esm/components/SymbolMapper.js.map +1 -0
- package/lib/esm/decorators/afterDeserialize.js +35 -0
- package/lib/esm/decorators/afterDeserialize.js.map +1 -0
- package/lib/esm/decorators/beforeDeserialize.js +35 -0
- package/lib/esm/decorators/beforeDeserialize.js.map +1 -0
- package/lib/esm/decorators/jsonMapper.js +14 -0
- package/lib/esm/decorators/jsonMapper.js.map +1 -0
- package/lib/esm/decorators/onDeserialize.js +25 -0
- package/lib/esm/decorators/onDeserialize.js.map +1 -0
- package/lib/esm/decorators/onSerialize.js +25 -0
- package/lib/esm/decorators/onSerialize.js.map +1 -0
- package/lib/esm/domain/JsonMapperContext.js +19 -0
- package/lib/esm/domain/JsonMapperContext.js.map +1 -0
- package/lib/esm/domain/JsonMapperTypesContainer.js +18 -0
- package/lib/esm/domain/JsonMapperTypesContainer.js.map +1 -0
- package/lib/esm/hooks/alterAfterDeserialize.js +5 -0
- package/lib/esm/hooks/alterAfterDeserialize.js.map +1 -0
- package/lib/esm/hooks/alterBeforeDeserialize.js +5 -0
- package/lib/esm/hooks/alterBeforeDeserialize.js.map +1 -0
- package/lib/esm/index.js +22 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/interfaces/JsonMapperMethods.js +2 -0
- package/lib/esm/interfaces/JsonMapperMethods.js.map +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/utils/deserialize.js +149 -0
- package/lib/esm/utils/deserialize.js.map +1 -0
- package/lib/esm/utils/serialize.js +140 -0
- package/lib/esm/utils/serialize.js.map +1 -0
- package/lib/{components → types/components}/ArrayMapper.d.ts +0 -0
- package/lib/{components → types/components}/DateMapper.d.ts +0 -0
- package/lib/{components → types/components}/MapMapper.d.ts +0 -0
- package/lib/{components → types/components}/PrimitiveMapper.d.ts +0 -0
- package/lib/{components → types/components}/SetMapper.d.ts +0 -0
- package/lib/{components → types/components}/SymbolMapper.d.ts +0 -0
- package/lib/{decorators → types/decorators}/afterDeserialize.d.ts +0 -0
- package/lib/{decorators → types/decorators}/beforeDeserialize.d.ts +0 -0
- package/lib/{decorators → types/decorators}/jsonMapper.d.ts +0 -0
- package/lib/{decorators → types/decorators}/onDeserialize.d.ts +0 -0
- package/lib/{decorators → types/decorators}/onSerialize.d.ts +0 -0
- package/lib/{domain → types/domain}/JsonMapperContext.d.ts +0 -0
- package/lib/types/domain/JsonMapperTypesContainer.d.ts +10 -0
- package/lib/{hooks → types/hooks}/alterAfterDeserialize.d.ts +0 -0
- package/lib/{hooks → types/hooks}/alterBeforeDeserialize.d.ts +0 -0
- package/lib/{index.d.ts → types/index.d.ts} +13 -3
- package/lib/{interfaces → types/interfaces}/JsonMapperMethods.d.ts +0 -0
- package/lib/{utils → types/utils}/deserialize.d.ts +6 -1
- package/lib/{utils → types/utils}/serialize.d.ts +7 -2
- package/package.json +34 -20
- package/readme.md +1 -0
- package/tsconfig.compile.esm.json +12 -0
- package/lib/components/index.d.ts +0 -6
- package/lib/domain/JsonMapperTypesContainer.d.ts +0 -10
- package/lib/index.js +0 -715
- package/lib/index.js.map +0 -1
- package/lib/index.modern.js +0 -704
- package/lib/index.modern.js.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { registerJsonTypeMapper } from "../domain/JsonMapperTypesContainer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register a new JsonMapper Type
|
|
4
|
+
* @param types
|
|
5
|
+
* @constructor
|
|
6
|
+
*/
|
|
7
|
+
export function JsonMapper(...types) {
|
|
8
|
+
return (target) => {
|
|
9
|
+
types.forEach((type) => {
|
|
10
|
+
registerJsonTypeMapper(type, target);
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=jsonMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonMapper.js","sourceRoot":"","sources":["../../../src/decorators/jsonMapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAG,KAAqB;IACjD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,sBAAsB,CAAC,IAAI,EAAE,MAAa,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {registerJsonTypeMapper} from \"../domain/JsonMapperTypesContainer\";\n\n/**\n * Register a new JsonMapper Type\n * @param types\n * @constructor\n */\nexport function JsonMapper(...types: (any | Type)[]): ClassDecorator {\n return (target) => {\n types.forEach((type) => {\n registerJsonTypeMapper(type, target as any);\n });\n };\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { JsonEntityFn } from "@tsed/schema";
|
|
2
|
+
/**
|
|
3
|
+
* Call the function before property deserialization.
|
|
4
|
+
*
|
|
5
|
+
* ## Example
|
|
6
|
+
*
|
|
7
|
+
* ```typescript
|
|
8
|
+
* class Model {
|
|
9
|
+
* @OnDeserialize(v => v + 1)
|
|
10
|
+
* property: string;
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @returns {Function}
|
|
15
|
+
* @decorator
|
|
16
|
+
* @schema
|
|
17
|
+
* @property
|
|
18
|
+
* @param cb
|
|
19
|
+
*/
|
|
20
|
+
export function OnDeserialize(cb) {
|
|
21
|
+
return JsonEntityFn((storedJson) => {
|
|
22
|
+
storedJson.schema.$hooks.on("onDeserialize", cb);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=onDeserialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onDeserialize.js","sourceRoot":"","sources":["../../../src/decorators/onDeserialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAC,MAAM,cAAc,CAAC;AAM3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAAC,EAAyB;IACrD,OAAO,YAAY,CAAC,CAAC,UAAU,EAAE,EAAE;QACjC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {JsonHookContext, JsonEntityFn} from \"@tsed/schema\";\n\nexport interface OnDeserializeCallback {\n (value: any, ctx: JsonHookContext): any;\n}\n\n/**\n * Call the function before property deserialization.\n *\n * ## Example\n *\n * ```typescript\n * class Model {\n * @OnDeserialize(v => v + 1)\n * property: string;\n * }\n * ```\n *\n * @returns {Function}\n * @decorator\n * @schema\n * @property\n * @param cb\n */\nexport function OnDeserialize(cb: OnDeserializeCallback): PropertyDecorator {\n return JsonEntityFn((storedJson) => {\n storedJson.schema.$hooks.on(\"onDeserialize\", cb);\n });\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { JsonEntityFn } from "@tsed/schema";
|
|
2
|
+
/**
|
|
3
|
+
* Call the function before property serialization.
|
|
4
|
+
*
|
|
5
|
+
* ## Example
|
|
6
|
+
*
|
|
7
|
+
* ```typescript
|
|
8
|
+
* class Model {
|
|
9
|
+
* @OnSerialize(v => v + 1)
|
|
10
|
+
* property: string;
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @returns {Function}
|
|
15
|
+
* @decorator
|
|
16
|
+
* @schema
|
|
17
|
+
* @property
|
|
18
|
+
* @param cb
|
|
19
|
+
*/
|
|
20
|
+
export function OnSerialize(cb) {
|
|
21
|
+
return JsonEntityFn((storedJson) => {
|
|
22
|
+
storedJson.schema.$hooks.on("onSerialize", cb);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=onSerialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onSerialize.js","sourceRoot":"","sources":["../../../src/decorators/onSerialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAkB,MAAM,cAAc,CAAC;AAM3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,EAAuB;IACjD,OAAO,YAAY,CAAC,CAAC,UAAU,EAAE,EAAE;QACjC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {JsonEntityFn, JsonHookContext} from \"@tsed/schema\";\n\nexport interface OnSerializeCallback {\n (value: any, ctx: JsonHookContext): any;\n}\n\n/**\n * Call the function before property serialization.\n *\n * ## Example\n *\n * ```typescript\n * class Model {\n * @OnSerialize(v => v + 1)\n * property: string;\n * }\n * ```\n *\n * @returns {Function}\n * @decorator\n * @schema\n * @property\n * @param cb\n */\nexport function OnSerialize(cb: OnSerializeCallback): PropertyDecorator {\n return JsonEntityFn((storedJson) => {\n storedJson.schema.$hooks.on(\"onSerialize\", cb);\n });\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { isCollection } from "@tsed/core";
|
|
2
|
+
/**
|
|
3
|
+
* @ignore
|
|
4
|
+
*/
|
|
5
|
+
export class JsonMapperContext {
|
|
6
|
+
constructor({ type, collectionType, next, options }) {
|
|
7
|
+
this.type = type;
|
|
8
|
+
this.collectionType = isCollection(collectionType) ? collectionType : undefined;
|
|
9
|
+
this._next = next;
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
next(data) {
|
|
13
|
+
return this._next(data, {
|
|
14
|
+
...this.options,
|
|
15
|
+
type: this.type
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=JsonMapperContext.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ignore
|
|
3
|
+
*/
|
|
4
|
+
// tslint:disable-next-line:variable-name
|
|
5
|
+
const JsonMapperTypesContainer = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* @ignore
|
|
8
|
+
*/
|
|
9
|
+
export function registerJsonTypeMapper(type, token) {
|
|
10
|
+
JsonMapperTypesContainer.set(type, new token());
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @ignore
|
|
14
|
+
*/
|
|
15
|
+
export function getJsonMapperTypes() {
|
|
16
|
+
return JsonMapperTypesContainer;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=JsonMapperTypesContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
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]);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=alterAfterDeserialize.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
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]);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=alterBeforeDeserialize.js.map
|
|
@@ -0,0 +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"]}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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";
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"JsonMapperMethods.js","sourceRoot":"","sources":["../../../src/interfaces/JsonMapperMethods.ts"],"names":[],"mappings":"","sourcesContent":["import {Type} from \"@tsed/core\";\n\nexport interface JsonMapperCtx<T = any, C = any> {\n collectionType: Type<C> | undefined;\n type: Type<T> | T;\n next: JsonMapperNext;\n}\n\nexport interface JsonMapperNext {\n (obj: any): any;\n}\n\nexport interface JsonMapperMethods {\n /**\n *\n * @param obj\n * @param {JsonMapperNext} ctx\n * @returns {any}\n */\n deserialize<T = any, C = any>(obj: any, ctx: JsonMapperCtx<T, C>): any;\n\n /**\n *\n * @param obj\n * @param ctx\n * @returns {any}\n */\n serialize(obj: any, ctx: JsonMapperCtx<any>): any;\n}\n"]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { isArray, isEmpty, isNil, nameOf, objectKeys } from "@tsed/core";
|
|
2
|
+
import { alterIgnore, getProperties, JsonEntityStore, JsonSchema } from "@tsed/schema";
|
|
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";
|
|
13
|
+
function isDeserializable(obj, options) {
|
|
14
|
+
if ((!!options.collectionType && isNil(obj)) || obj === undefined) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return !(isEmpty(options.type) || (options.type === Object && !options.collectionType));
|
|
18
|
+
}
|
|
19
|
+
function alterValue(schema, value, options) {
|
|
20
|
+
return schema.$hooks.alter("onDeserialize", value, [options]);
|
|
21
|
+
}
|
|
22
|
+
function transformCollection(src, options) {
|
|
23
|
+
var _a;
|
|
24
|
+
const { types, type = Object, collectionType } = options;
|
|
25
|
+
const context = new JsonMapperContext({
|
|
26
|
+
type,
|
|
27
|
+
collectionType,
|
|
28
|
+
options,
|
|
29
|
+
next: (data, { collectionType, ...options }) => deserialize(data, options)
|
|
30
|
+
});
|
|
31
|
+
return (_a = types === null || types === void 0 ? void 0 : types.get(options.collectionType)) === null || _a === void 0 ? void 0 : _a.deserialize(src, context);
|
|
32
|
+
}
|
|
33
|
+
function transformType(src, options) {
|
|
34
|
+
var _a;
|
|
35
|
+
const { types, type = Object } = options;
|
|
36
|
+
const context = new JsonMapperContext({
|
|
37
|
+
type,
|
|
38
|
+
options,
|
|
39
|
+
next: (data, { type, ...options }) => deserialize(data, options)
|
|
40
|
+
});
|
|
41
|
+
return (_a = types === null || types === void 0 ? void 0 : types.get(type)) === null || _a === void 0 ? void 0 : _a.deserialize(src, context);
|
|
42
|
+
}
|
|
43
|
+
function mapItemOptions(propStore, options) {
|
|
44
|
+
const itemOpts = {
|
|
45
|
+
...options,
|
|
46
|
+
store: undefined,
|
|
47
|
+
type: propStore.computedType
|
|
48
|
+
};
|
|
49
|
+
if (propStore.schema.hasGenerics) {
|
|
50
|
+
itemOpts.nestedGenerics = propStore.schema.nestedGenerics;
|
|
51
|
+
}
|
|
52
|
+
else if (propStore.schema.isGeneric && options.nestedGenerics) {
|
|
53
|
+
const [genericTypes = [], ...nestedGenerics] = options.nestedGenerics;
|
|
54
|
+
const genericLabels = propStore.parent.schema.genericLabels || [];
|
|
55
|
+
itemOpts.type = genericTypes[genericLabels.indexOf(propStore.schema.genericType)] || Object;
|
|
56
|
+
if (itemOpts.type instanceof JsonSchema) {
|
|
57
|
+
itemOpts.type = itemOpts.type.getTarget();
|
|
58
|
+
}
|
|
59
|
+
itemOpts.nestedGenerics = nestedGenerics;
|
|
60
|
+
}
|
|
61
|
+
return itemOpts;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Transform given plain object to class.
|
|
65
|
+
* @param src
|
|
66
|
+
* @param options
|
|
67
|
+
*/
|
|
68
|
+
export function plainObjectToClass(src, options) {
|
|
69
|
+
if (isEmpty(src)) {
|
|
70
|
+
return src;
|
|
71
|
+
}
|
|
72
|
+
const { type, store = JsonEntityStore.from(type) } = options;
|
|
73
|
+
const propertiesMap = getProperties(store, { ...options, withIgnoredProps: true });
|
|
74
|
+
let keys = new Set(objectKeys(src));
|
|
75
|
+
const additionalProperties = propertiesMap.size ? !!store.schema.get("additionalProperties") || options.additionalProperties : true;
|
|
76
|
+
src = alterBeforeDeserialize(src, store.schema, options);
|
|
77
|
+
const out = new type(src);
|
|
78
|
+
propertiesMap.forEach((propStore) => {
|
|
79
|
+
const key = options.useAlias
|
|
80
|
+
? propStore.parent.schema.getAliasOf(propStore.propertyName) || propStore.propertyName
|
|
81
|
+
: propStore.propertyName;
|
|
82
|
+
keys.delete(key);
|
|
83
|
+
if (alterIgnore(propStore.schema, options)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
let value = alterValue(propStore.schema, src[key], { ...options, self: src });
|
|
87
|
+
const itemOptions = mapItemOptions(propStore, options);
|
|
88
|
+
value = deserialize(value, {
|
|
89
|
+
...itemOptions,
|
|
90
|
+
self: src,
|
|
91
|
+
type: value === src[key] ? itemOptions.type : undefined,
|
|
92
|
+
collectionType: propStore.collectionType
|
|
93
|
+
});
|
|
94
|
+
if (value !== undefined) {
|
|
95
|
+
out[propStore.propertyName] = value;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
if (additionalProperties) {
|
|
99
|
+
keys.forEach((key) => {
|
|
100
|
+
out[key] = src[key];
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return alterAfterDeserialize(out, store.schema, options);
|
|
104
|
+
}
|
|
105
|
+
function buildOptions(options) {
|
|
106
|
+
if (options.store instanceof JsonEntityStore) {
|
|
107
|
+
if (options.store.parameter && options.store.parameter.nestedGenerics.length) {
|
|
108
|
+
options.nestedGenerics = options.store.parameter.nestedGenerics;
|
|
109
|
+
}
|
|
110
|
+
options.type = options.store.computedType;
|
|
111
|
+
options.collectionType = options.store.collectionType;
|
|
112
|
+
delete options.store;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
groups: false,
|
|
116
|
+
useAlias: true,
|
|
117
|
+
...options,
|
|
118
|
+
type: options.type ? options.type : undefined,
|
|
119
|
+
types: options.types ? options.types : getJsonMapperTypes()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Transform given source to class base on the given `options.type`.
|
|
124
|
+
*
|
|
125
|
+
* @param src
|
|
126
|
+
* @param options
|
|
127
|
+
*/
|
|
128
|
+
export function deserialize(src, options = {}) {
|
|
129
|
+
var _a, _b;
|
|
130
|
+
options = buildOptions(options);
|
|
131
|
+
if (!isDeserializable(src, options)) {
|
|
132
|
+
return src;
|
|
133
|
+
}
|
|
134
|
+
if (!options.collectionType && isArray(src)) {
|
|
135
|
+
options.collectionType = Array;
|
|
136
|
+
}
|
|
137
|
+
if (options.collectionType) {
|
|
138
|
+
if (!((_a = options.types) === null || _a === void 0 ? void 0 : _a.has(options.collectionType))) {
|
|
139
|
+
throw new Error(`${nameOf(options.collectionType)} is not supported by JsonMapper.`);
|
|
140
|
+
}
|
|
141
|
+
return transformCollection(src, options);
|
|
142
|
+
}
|
|
143
|
+
if ((_b = options.types) === null || _b === void 0 ? void 0 : _b.has(options.type)) {
|
|
144
|
+
return transformType(src, options);
|
|
145
|
+
}
|
|
146
|
+
// class converter
|
|
147
|
+
return plainObjectToClass(src, options);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=deserialize.js.map
|
|
@@ -0,0 +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, 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\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 const additionalProperties = propertiesMap.size ? !!store.schema.get(\"additionalProperties\") || options.additionalProperties : true;\n\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) {\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"]}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { classOf, isArray, isClassObject, isCollection, isDate, isEmpty, isFunction, isNil, nameOf, objectKeys } from "@tsed/core";
|
|
2
|
+
import { alterIgnore, getPropertiesStores, JsonEntityStore } from "@tsed/schema";
|
|
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
|
+
function alterValue(schema, value, options) {
|
|
12
|
+
return schema.$hooks.alter("onSerialize", value, [options]);
|
|
13
|
+
}
|
|
14
|
+
function getSchemaProperties(storedJson, obj) {
|
|
15
|
+
const stores = Array.from(getPropertiesStores(storedJson).entries());
|
|
16
|
+
if (!stores.length) {
|
|
17
|
+
// fallback to auto discovering field from obj
|
|
18
|
+
objectKeys(obj).forEach((key) => {
|
|
19
|
+
const propStore = JsonEntityStore.from(storedJson.target, key);
|
|
20
|
+
stores.push([key, propStore]);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return stores;
|
|
24
|
+
}
|
|
25
|
+
function getObjectProperties(obj) {
|
|
26
|
+
return Object.entries(obj).filter(([, value]) => !isFunction(value));
|
|
27
|
+
}
|
|
28
|
+
function getType(propStore, value) {
|
|
29
|
+
if (isNil(value) || propStore.type === Object || isCollection(propStore.type)) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return propStore.type;
|
|
33
|
+
}
|
|
34
|
+
export function classToPlainObject(obj, options) {
|
|
35
|
+
const { useAlias = true, type, ...props } = options;
|
|
36
|
+
const entity = JsonEntityStore.from(type || obj);
|
|
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);
|
|
42
|
+
const schema = propStore.schema;
|
|
43
|
+
if (alterIgnore(schema, { useAlias, ...props, self: obj })) {
|
|
44
|
+
return newObj;
|
|
45
|
+
}
|
|
46
|
+
let value = alterValue(schema, obj[key], { useAlias, ...props, self: obj });
|
|
47
|
+
value = serialize(value, {
|
|
48
|
+
useAlias,
|
|
49
|
+
self: obj,
|
|
50
|
+
type: value === obj[key] ? getType(propStore, value) : undefined,
|
|
51
|
+
collectionType: propStore.collectionType,
|
|
52
|
+
...props
|
|
53
|
+
});
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
return newObj;
|
|
56
|
+
}
|
|
57
|
+
key = useAlias ? propStore.parent.schema.getAliasOf(key) || key : key;
|
|
58
|
+
return {
|
|
59
|
+
...newObj,
|
|
60
|
+
[key]: value
|
|
61
|
+
};
|
|
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;
|
|
71
|
+
}
|
|
72
|
+
function toObject(obj, options) {
|
|
73
|
+
return getObjectProperties(obj).reduce((newObj, [key, value]) => ({
|
|
74
|
+
...newObj,
|
|
75
|
+
[key]: serialize(value, options)
|
|
76
|
+
}), {});
|
|
77
|
+
}
|
|
78
|
+
function getBestType(type, obj) {
|
|
79
|
+
const dataType = classOf(obj);
|
|
80
|
+
if (dataType && !isClassObject(dataType)) {
|
|
81
|
+
return dataType;
|
|
82
|
+
}
|
|
83
|
+
return type || Object;
|
|
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 === null || obj === void 0 ? void 0 : obj._isAMomentObject);
|
|
93
|
+
}
|
|
94
|
+
export function serialize(obj, { type, collectionType, groups = false, ...options } = {}) {
|
|
95
|
+
var _a;
|
|
96
|
+
if (isEmpty(obj)) {
|
|
97
|
+
return obj;
|
|
98
|
+
}
|
|
99
|
+
let currentType = type;
|
|
100
|
+
const types = options.types ? options.types : getJsonMapperTypes();
|
|
101
|
+
options.groups = groups;
|
|
102
|
+
// FIX custom serialization function from @tsed/mongoose and bson
|
|
103
|
+
if (isMongooseObject(obj)) {
|
|
104
|
+
return obj.toJSON(options);
|
|
105
|
+
}
|
|
106
|
+
if (hasJsonMethod(obj) && !isMomentObject(obj) && !isDate(obj)) {
|
|
107
|
+
return serialize(obj.toJSON(), { ...options, type: classOf(obj) });
|
|
108
|
+
}
|
|
109
|
+
if (!isCollection(obj)) {
|
|
110
|
+
options.type = currentType = getBestType(currentType, obj);
|
|
111
|
+
}
|
|
112
|
+
else if (!options.collectionType) {
|
|
113
|
+
currentType = classOf(obj);
|
|
114
|
+
options.type = type;
|
|
115
|
+
options.collectionType = currentType;
|
|
116
|
+
}
|
|
117
|
+
const context = new JsonMapperContext({
|
|
118
|
+
type: currentType,
|
|
119
|
+
options,
|
|
120
|
+
next: (data) => serialize(data, {
|
|
121
|
+
...options,
|
|
122
|
+
collectionType: undefined,
|
|
123
|
+
type: options.type
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
const mapper = types.get(currentType) || types.get(nameOf(currentType));
|
|
127
|
+
if (mapper) {
|
|
128
|
+
const jsonMapper = mapper;
|
|
129
|
+
return jsonMapper.serialize(obj, context);
|
|
130
|
+
}
|
|
131
|
+
else if (obj === null || obj === void 0 ? void 0 : obj._isAMomentObject) {
|
|
132
|
+
return obj.toJSON();
|
|
133
|
+
}
|
|
134
|
+
if (isArray(obj)) {
|
|
135
|
+
// Serialize Array class like
|
|
136
|
+
return (_a = types.get(Array)) === null || _a === void 0 ? void 0 : _a.serialize(obj, context);
|
|
137
|
+
}
|
|
138
|
+
return !isClassObject(currentType) ? classToPlainObject(obj, options) : toObject(obj, options);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +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"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type } from "@tsed/core";
|
|
2
|
+
import { JsonMapperMethods } from "../interfaces/JsonMapperMethods";
|
|
3
|
+
/**
|
|
4
|
+
* @ignore
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerJsonTypeMapper(type: Type<any> | Symbol | string, token: Type<JsonMapperMethods>): void;
|
|
7
|
+
/**
|
|
8
|
+
* @ignore
|
|
9
|
+
*/
|
|
10
|
+
export declare function getJsonMapperTypes(): Map<Type<any> | Symbol | string, JsonMapperMethods>;
|
|
File without changes
|
|
File without changes
|
|
@@ -1,11 +1,21 @@
|
|
|
1
|
-
|
|
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";
|
|
File without changes
|
|
@@ -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
|
/**
|