mapper-factory 1.0.33 → 1.0.34
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/dist/example.d.ts +1 -0
- package/dist/example.js +135 -0
- package/dist/field.decorator.d.ts +22 -0
- package/dist/field.decorator.js +54 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +13 -0
- package/dist/mapper.d.ts +46 -0
- package/dist/mapper.js +286 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/example.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const field_decorator_1 = require("../src/field.decorator");
|
|
13
|
+
const mapper_1 = require("../src/mapper");
|
|
14
|
+
class History extends mapper_1.MapperFactory {
|
|
15
|
+
}
|
|
16
|
+
__decorate([
|
|
17
|
+
(0, field_decorator_1.MapField)({
|
|
18
|
+
transformer: (arr) => " TEST TRASFORMER",
|
|
19
|
+
reverser: (arr) => " TEST REVERSER",
|
|
20
|
+
}),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], History.prototype, "name", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, field_decorator_1.MapField)({
|
|
25
|
+
src: "control"
|
|
26
|
+
}),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], History.prototype, "testControl", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, field_decorator_1.MapField)({
|
|
31
|
+
initialize: true,
|
|
32
|
+
transformer: (arr, obj) => { return [obj.monday, obj.tuesday]; },
|
|
33
|
+
reverser: (arr) => {
|
|
34
|
+
return { monday: arr && arr[0], tuesday: arr && arr[1] };
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
__metadata("design:type", Array)
|
|
38
|
+
], History.prototype, "daysActive", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, field_decorator_1.MapField)({
|
|
41
|
+
src: "test.concatenation"
|
|
42
|
+
}),
|
|
43
|
+
__metadata("design:type", String)
|
|
44
|
+
], History.prototype, "testConcatenation", void 0);
|
|
45
|
+
class User extends mapper_1.MapperFactory {
|
|
46
|
+
}
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, field_decorator_1.MapField)({
|
|
49
|
+
src: 'firstName'
|
|
50
|
+
}),
|
|
51
|
+
__metadata("design:type", String)
|
|
52
|
+
], User.prototype, "name", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, field_decorator_1.MapField)({
|
|
55
|
+
src: 'lastName'
|
|
56
|
+
}),
|
|
57
|
+
__metadata("design:type", String)
|
|
58
|
+
], User.prototype, "surname", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
(0, field_decorator_1.MapField)({
|
|
61
|
+
src: 'rolesToMap',
|
|
62
|
+
transformer: (arr) => arr?.map(role => role + " TEST TRASFORMER"),
|
|
63
|
+
reverser: (arr) => arr?.map(role => role.replace(" TEST TRASFORMER", "")),
|
|
64
|
+
}),
|
|
65
|
+
__metadata("design:type", Array)
|
|
66
|
+
], User.prototype, "roles", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, field_decorator_1.MapField)({
|
|
69
|
+
transformer: (arr) => arr?.map(user => new User(user))
|
|
70
|
+
}),
|
|
71
|
+
__metadata("design:type", Array)
|
|
72
|
+
], User.prototype, "employees", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, field_decorator_1.MapField)({
|
|
75
|
+
transformer: (user) => new User(user)
|
|
76
|
+
}),
|
|
77
|
+
__metadata("design:type", User)
|
|
78
|
+
], User.prototype, "boss", void 0);
|
|
79
|
+
__decorate([
|
|
80
|
+
(0, field_decorator_1.MapField)({
|
|
81
|
+
transformer: histories => histories?.map(hst => new History(hst)),
|
|
82
|
+
reverser: histories => histories?.map(hst => hst.toMap()),
|
|
83
|
+
}),
|
|
84
|
+
__metadata("design:type", Array)
|
|
85
|
+
], User.prototype, "histories", void 0);
|
|
86
|
+
let emp1 = new User({ firstName: "Summer", lastName: "Smith" });
|
|
87
|
+
let emp2 = new User({ firstName: "Morty", lastName: "Smith" });
|
|
88
|
+
let JSONObject = { firstName: "Rick", lastName: "Sanchez", employees: [emp1.toMap(), emp2.toMap()], rolesToMap: ["CEO", "EMPLOYEE"], boss: { firstName: "Nello", lastName: "Stanco" } };
|
|
89
|
+
//TEST constructor
|
|
90
|
+
let u = new User(JSONObject);
|
|
91
|
+
console.log("\nTEST constructor");
|
|
92
|
+
console.log(JSONObject);
|
|
93
|
+
console.log(u);
|
|
94
|
+
//TEST objToModel method with JS Object
|
|
95
|
+
let u1 = new User();
|
|
96
|
+
console.log("\nTEST objToModel method with JS Object");
|
|
97
|
+
console.log(u1.objToModel(u));
|
|
98
|
+
//TEST objToModel method with JSON Object
|
|
99
|
+
console.log("\nTEST objToModel method with JSON Object");
|
|
100
|
+
console.log(u.objToModel({ name: "Rick TEST-objToModel", roles: ["CEO TEST-objToModel", "EMPLOYEE TEST-objToModel"] }));
|
|
101
|
+
//TEST toMap method
|
|
102
|
+
console.log("\nTEST toMap method");
|
|
103
|
+
console.log(u.toMap());
|
|
104
|
+
//TEST empty method
|
|
105
|
+
console.log("\nTEST empty method");
|
|
106
|
+
console.log(u.empty());
|
|
107
|
+
//TEST get AND set method
|
|
108
|
+
u.set("employees[1].name", "name editato");
|
|
109
|
+
console.log("\nTEST get AND set method");
|
|
110
|
+
console.log(u);
|
|
111
|
+
console.log(u.get("employees[1].name"));
|
|
112
|
+
//TEST deep copy
|
|
113
|
+
console.log("\nTEST deep copy");
|
|
114
|
+
let dpCopy = new User(u.toMap());
|
|
115
|
+
dpCopy.name = "nome dpCopy";
|
|
116
|
+
console.log(u);
|
|
117
|
+
console.log(dpCopy);
|
|
118
|
+
//TEST trasformer/reverser
|
|
119
|
+
console.log("\nTEST reverser");
|
|
120
|
+
let h1 = new History({ name: "h1" });
|
|
121
|
+
let h2 = new History({ name: "h2" });
|
|
122
|
+
u.histories = [h1, h2];
|
|
123
|
+
console.log(u);
|
|
124
|
+
console.log(u.toMap());
|
|
125
|
+
//TEST ref
|
|
126
|
+
console.log("\nTEST REF");
|
|
127
|
+
let hTest = new History({ monday: "0", tuesday: "1", control: "control" });
|
|
128
|
+
console.log(hTest);
|
|
129
|
+
hTest.daysActive = ['1', '0'];
|
|
130
|
+
console.log(hTest.toMap());
|
|
131
|
+
//TEST concat with point
|
|
132
|
+
console.log("\nTEST CONCAT W POINT");
|
|
133
|
+
let hTest2 = new History({ test: { concatenation: "resolve " }, control: "control" });
|
|
134
|
+
console.log(hTest2);
|
|
135
|
+
console.log(hTest2.toMap());
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ClassType } from './types';
|
|
3
|
+
export declare const MAP_FIELD: unique symbol;
|
|
4
|
+
export interface MapperMetadata<T = any> {
|
|
5
|
+
src?: string;
|
|
6
|
+
initialize?: boolean;
|
|
7
|
+
transformer?: {
|
|
8
|
+
(input: any, ref: any): any;
|
|
9
|
+
};
|
|
10
|
+
reverser?: {
|
|
11
|
+
(input: any): any;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare function isClass(func: any): func is ClassType;
|
|
15
|
+
export declare function getPrototype(target: Record<string, unknown> | ClassType): any;
|
|
16
|
+
export declare const MapField: <T = any>({ transformer, reverser, src, initialize, }?: MapperMetadata<T>) => PropertyDecorator;
|
|
17
|
+
export declare const getMapFieldMetadataList: (target: Record<string, unknown> | ClassType | any) => {
|
|
18
|
+
[key: string]: MapperMetadata<any>;
|
|
19
|
+
};
|
|
20
|
+
export declare const hasMapFieldMetadataList: (target: Record<string, unknown> | ClassType) => boolean;
|
|
21
|
+
export declare const getMapFieldMetadata: (target: Record<string, unknown> | ClassType, propertyName: string | symbol) => MapperMetadata | undefined;
|
|
22
|
+
export declare const hasMapFieldMetadata: (target: Record<string, unknown> | ClassType, propertyName: string) => boolean;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasMapFieldMetadata = exports.getMapFieldMetadata = exports.hasMapFieldMetadataList = exports.getMapFieldMetadataList = exports.MapField = exports.getPrototype = exports.isClass = exports.MAP_FIELD = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
exports.MAP_FIELD = Symbol('MAP_FIELD');
|
|
6
|
+
function isClass(func) {
|
|
7
|
+
return (typeof func === 'function' &&
|
|
8
|
+
/^class\s/.test(Function.prototype.toString.call(func)));
|
|
9
|
+
}
|
|
10
|
+
exports.isClass = isClass;
|
|
11
|
+
function getPrototype(target) {
|
|
12
|
+
return isClass(target) || !target.prototype ? !target.constructor ? target : target.constructor : target.prototype;
|
|
13
|
+
}
|
|
14
|
+
exports.getPrototype = getPrototype;
|
|
15
|
+
const MapField = ({ transformer, reverser, src, initialize = false, } = {}) => {
|
|
16
|
+
return (target, property) => {
|
|
17
|
+
const classConstructor = target.constructor;
|
|
18
|
+
const propertyName = property.toString();
|
|
19
|
+
const metadata = Reflect.getMetadata(exports.MAP_FIELD, classConstructor) || {};
|
|
20
|
+
// create new object reference to avoid this issue: https://github.com/rbuckton/reflect-metadata/issues/62
|
|
21
|
+
const newMetadata = { ...metadata };
|
|
22
|
+
const previousValues = metadata[propertyName];
|
|
23
|
+
newMetadata[propertyName] = {
|
|
24
|
+
...previousValues,
|
|
25
|
+
src,
|
|
26
|
+
initialize,
|
|
27
|
+
transformer,
|
|
28
|
+
reverser,
|
|
29
|
+
};
|
|
30
|
+
Reflect.defineMetadata(exports.MAP_FIELD, newMetadata, classConstructor);
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
exports.MapField = MapField;
|
|
34
|
+
const getMapFieldMetadataList = (target) => {
|
|
35
|
+
return Reflect.getMetadata(exports.MAP_FIELD, getPrototype(target));
|
|
36
|
+
};
|
|
37
|
+
exports.getMapFieldMetadataList = getMapFieldMetadataList;
|
|
38
|
+
const hasMapFieldMetadataList = (target) => {
|
|
39
|
+
return Reflect.hasMetadata(exports.MAP_FIELD, getPrototype(target));
|
|
40
|
+
};
|
|
41
|
+
exports.hasMapFieldMetadataList = hasMapFieldMetadataList;
|
|
42
|
+
const getMapFieldMetadata = (target, propertyName) => {
|
|
43
|
+
const metadata = (0, exports.getMapFieldMetadataList)(target);
|
|
44
|
+
const name = propertyName.toString();
|
|
45
|
+
if (!metadata || !metadata[name])
|
|
46
|
+
return undefined;
|
|
47
|
+
return metadata[name];
|
|
48
|
+
};
|
|
49
|
+
exports.getMapFieldMetadata = getMapFieldMetadata;
|
|
50
|
+
const hasMapFieldMetadata = (target, propertyName) => {
|
|
51
|
+
const metadata = Reflect.getMetadata(exports.MAP_FIELD, getPrototype(target));
|
|
52
|
+
return metadata && !!metadata[propertyName];
|
|
53
|
+
};
|
|
54
|
+
exports.hasMapFieldMetadata = hasMapFieldMetadata;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MapField } from "./field.decorator";
|
|
2
|
+
import { MapperFactory } from "./mapper";
|
|
3
|
+
import { ClassType } from "./types";
|
|
4
|
+
export { MapField, MapperFactory, ClassType };
|
|
5
|
+
/**
|
|
6
|
+
* npx tsc
|
|
7
|
+
* npx ts-node src/example.ts
|
|
8
|
+
* npm version patch
|
|
9
|
+
* npm publish
|
|
10
|
+
*/
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MapperFactory = exports.MapField = void 0;
|
|
4
|
+
const field_decorator_1 = require("./field.decorator");
|
|
5
|
+
Object.defineProperty(exports, "MapField", { enumerable: true, get: function () { return field_decorator_1.MapField; } });
|
|
6
|
+
const mapper_1 = require("./mapper");
|
|
7
|
+
Object.defineProperty(exports, "MapperFactory", { enumerable: true, get: function () { return mapper_1.MapperFactory; } });
|
|
8
|
+
/**
|
|
9
|
+
* npx tsc
|
|
10
|
+
* npx ts-node src/example.ts
|
|
11
|
+
* npm version patch
|
|
12
|
+
* npm publish
|
|
13
|
+
*/
|
package/dist/mapper.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ClassType } from "./types";
|
|
2
|
+
export declare class MapperFactory {
|
|
3
|
+
/**
|
|
4
|
+
* Constructor of the mapper.
|
|
5
|
+
*
|
|
6
|
+
* @param object object to be mapped considering metadata "src", "transformer" and "reverser"
|
|
7
|
+
*/
|
|
8
|
+
constructor(object?: any);
|
|
9
|
+
/**
|
|
10
|
+
* Convert the instance of this class to JSON Object.
|
|
11
|
+
*
|
|
12
|
+
* @returns JSON object mapped considering metadata "src" and "reverser"
|
|
13
|
+
*/
|
|
14
|
+
toMap(): any;
|
|
15
|
+
/**
|
|
16
|
+
* Convert a JSON Object to an instance of this class.
|
|
17
|
+
*
|
|
18
|
+
* @param obj JSON Object
|
|
19
|
+
* @returns Instance of this class
|
|
20
|
+
*/
|
|
21
|
+
objToModel(obj: Object): this;
|
|
22
|
+
/**
|
|
23
|
+
* Check if this instance is empty.
|
|
24
|
+
*
|
|
25
|
+
* @returns true or false
|
|
26
|
+
*/
|
|
27
|
+
empty(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* GET property value from a string path.
|
|
30
|
+
*
|
|
31
|
+
* @param path String path
|
|
32
|
+
* @returns Value of the property
|
|
33
|
+
*/
|
|
34
|
+
get<T>(path: string): T;
|
|
35
|
+
/**
|
|
36
|
+
* SET property value from a string path.
|
|
37
|
+
*
|
|
38
|
+
* @param path String path
|
|
39
|
+
* @param value Value of the property
|
|
40
|
+
*/
|
|
41
|
+
set(path: string, value: any): void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated The method should not be used
|
|
45
|
+
*/
|
|
46
|
+
export declare function MapperFactoryFun(baseClass?: ClassType): ClassType;
|
package/dist/mapper.js
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MapperFactoryFun = exports.MapperFactory = void 0;
|
|
4
|
+
const field_decorator_1 = require("./field.decorator");
|
|
5
|
+
class MapperFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Constructor of the mapper.
|
|
8
|
+
*
|
|
9
|
+
* @param object object to be mapped considering metadata "src", "transformer" and "reverser"
|
|
10
|
+
*/
|
|
11
|
+
constructor(object) {
|
|
12
|
+
const metadataList = (0, field_decorator_1.getMapFieldMetadataList)(this);
|
|
13
|
+
object && Object.keys(object).forEach(propertyName => {
|
|
14
|
+
let metaKeys = metadataList && Object.keys(metadataList).filter(metadata => metadataList[metadata]?.src?.split('.')?.includes(propertyName));
|
|
15
|
+
if (metaKeys?.length) {
|
|
16
|
+
metaKeys.forEach(metaKey => {
|
|
17
|
+
let metaProp = metadataList[metaKey];
|
|
18
|
+
if (metaProp) {
|
|
19
|
+
let props = metaProp.src?.split('.');
|
|
20
|
+
let propsStereoid = props.map(prop => {
|
|
21
|
+
let index = prop.indexOf('[');
|
|
22
|
+
return {
|
|
23
|
+
prop: index > 0 ? prop.substring(0, index) : prop,
|
|
24
|
+
isArray: prop.includes('[') && prop.includes(']'),
|
|
25
|
+
arrIndex: prop.substring(index),
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
let i;
|
|
29
|
+
let objCopy = { ...object };
|
|
30
|
+
for (i = 0; i < propsStereoid.length; i++) {
|
|
31
|
+
if (propsStereoid[i].isArray) {
|
|
32
|
+
let arrIndex = propsStereoid[i].arrIndex?.split(/\[(\w+)\]/g)?.filter(index => index !== '');
|
|
33
|
+
objCopy = objCopy[propsStereoid[i].prop];
|
|
34
|
+
arrIndex.forEach((index, i) => {
|
|
35
|
+
objCopy = objCopy[index];
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
objCopy = objCopy[propsStereoid[i].prop];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (metaProp?.transformer) {
|
|
43
|
+
this[metaKey] = metaProp.transformer(objCopy, object);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this[metaKey] = objCopy;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
let metaKey = metadataList && Object.keys(metadataList).find(metadata => metadataList[metadata]?.src == propertyName);
|
|
51
|
+
if (metaKey) {
|
|
52
|
+
const src = metadataList[metaKey].src || propertyName;
|
|
53
|
+
if (metadataList[metaKey].transformer) {
|
|
54
|
+
this[metaKey] = metadataList[metaKey].transformer(object[src], object);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this[metaKey] = object[src];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (metadataList[propertyName]?.transformer) {
|
|
62
|
+
this[propertyName] = metadataList[propertyName].transformer(object[propertyName], object);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this[propertyName] = object[propertyName];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
let metaKey = metadataList && Object.keys(metadataList).find(metadata => metadataList[metadata]?.src == propertyName);
|
|
73
|
+
if (metaKey) {
|
|
74
|
+
const src = metadataList[metaKey].src || propertyName;
|
|
75
|
+
if (metadataList[metaKey].transformer) {
|
|
76
|
+
this[metaKey] = metadataList[metaKey].transformer(object[src], object);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this[metaKey] = object[src];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
if (metadataList && metadataList[propertyName]?.transformer) {
|
|
84
|
+
this[propertyName] = metadataList[propertyName].transformer(object[propertyName], object);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this[propertyName] = object[propertyName];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
//MAP CASE initialize = true
|
|
93
|
+
metadataList && Object.keys(metadataList).forEach(metaName => {
|
|
94
|
+
if (metadataList[metaName]?.initialize && metadataList[metaName]?.transformer) {
|
|
95
|
+
this[metaName] = metadataList[metaName]?.transformer(null, object);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Convert the instance of this class to JSON Object.
|
|
101
|
+
*
|
|
102
|
+
* @returns JSON object mapped considering metadata "src" and "reverser"
|
|
103
|
+
*/
|
|
104
|
+
toMap() {
|
|
105
|
+
const metadataList = (0, field_decorator_1.getMapFieldMetadataList)(this);
|
|
106
|
+
let obj = {};
|
|
107
|
+
this && Object.keys(this).forEach(propertyName => {
|
|
108
|
+
if (metadataList && Object.keys(metadataList).some(prop => prop == propertyName)) {
|
|
109
|
+
const src = metadataList[propertyName].src || propertyName;
|
|
110
|
+
if (src.includes('.')) {
|
|
111
|
+
let props = src.split('.');
|
|
112
|
+
let propsStereoid = props.map(prop => {
|
|
113
|
+
let index = prop.indexOf('[');
|
|
114
|
+
return {
|
|
115
|
+
prop: index > 0 ? prop.substring(0, index) : prop,
|
|
116
|
+
isArray: prop.includes('[') && prop.includes(']'),
|
|
117
|
+
arrIndex: prop.substring(index),
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
let i;
|
|
121
|
+
let objCopy = obj;
|
|
122
|
+
let lastIndex;
|
|
123
|
+
for (i = 0; i < propsStereoid?.length; i++) {
|
|
124
|
+
if (propsStereoid[i].isArray) {
|
|
125
|
+
let arrIndex = propsStereoid[i].arrIndex?.split(/\[(\w+)\]/g)?.filter(index => index !== '');
|
|
126
|
+
objCopy[propsStereoid[i].prop] = objCopy[propsStereoid[i].prop] || [];
|
|
127
|
+
objCopy = objCopy[propsStereoid[i].prop];
|
|
128
|
+
arrIndex.forEach((index, i) => {
|
|
129
|
+
objCopy[index] = objCopy[index] || (i == arrIndex.length - 1 ? {} : []);
|
|
130
|
+
if (!(i == propsStereoid.length - 1))
|
|
131
|
+
objCopy = objCopy[index];
|
|
132
|
+
else
|
|
133
|
+
lastIndex = index;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
objCopy[propsStereoid[i].prop] = objCopy[propsStereoid[i].prop] || {};
|
|
138
|
+
if (!(i == propsStereoid?.length - 1))
|
|
139
|
+
objCopy = objCopy[propsStereoid[i].prop];
|
|
140
|
+
else
|
|
141
|
+
lastIndex = propsStereoid[i].prop;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (Array.isArray(this[propertyName])) {
|
|
145
|
+
objCopy[lastIndex] = metadataList[propertyName].reverser ?
|
|
146
|
+
metadataList[propertyName].reverser(this[propertyName], this)
|
|
147
|
+
: this[propertyName].map(item => {
|
|
148
|
+
return item?.toMap ? item.toMap() : item;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else if (metadataList[propertyName].toMap) {
|
|
152
|
+
objCopy[lastIndex] = this[propertyName]?.toMap();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
objCopy[lastIndex] = metadataList[propertyName].reverser ? metadataList[propertyName].reverser(this[propertyName], this) : this[propertyName];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (metadataList[propertyName]?.initialize && metadataList[propertyName]?.reverser) {
|
|
160
|
+
const revObj = metadataList[propertyName]?.reverser(this[propertyName]);
|
|
161
|
+
revObj && Object.keys(revObj).forEach(key => {
|
|
162
|
+
if (revObj[key])
|
|
163
|
+
obj[key] = revObj[key];
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
if (Array.isArray(this[propertyName]) && !metadataList[propertyName]?.reverser) {
|
|
168
|
+
obj[src] = this[propertyName].map(item => {
|
|
169
|
+
return item?.toMap ? item.toMap() : item;
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else if (this[propertyName]?.toMap) {
|
|
173
|
+
obj[src] = this[propertyName]?.toMap();
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
obj[src] = metadataList[propertyName]?.reverser ? metadataList[propertyName].reverser(this[propertyName], this) : this[propertyName];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
if (!obj[propertyName])
|
|
183
|
+
obj[propertyName] = (metadataList && metadataList[propertyName]?.reverser) ? metadataList[propertyName].reverser(this[propertyName], this) : this[propertyName];
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
return obj;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Convert a JSON Object to an instance of this class.
|
|
190
|
+
*
|
|
191
|
+
* @param obj JSON Object
|
|
192
|
+
* @returns Instance of this class
|
|
193
|
+
*/
|
|
194
|
+
objToModel(obj) {
|
|
195
|
+
const metadataList = (0, field_decorator_1.getMapFieldMetadataList)(this);
|
|
196
|
+
obj && Object.keys(obj).forEach(propertyName => {
|
|
197
|
+
if (metadataList && Object.keys(metadataList).some(prop => prop == propertyName)) {
|
|
198
|
+
if (metadataList[propertyName].transformer) {
|
|
199
|
+
if (Array.isArray(obj[propertyName])) {
|
|
200
|
+
this[propertyName] = obj[propertyName].map(item => {
|
|
201
|
+
return item;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this[propertyName] = obj[propertyName];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
this[propertyName] = obj[propertyName];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this[propertyName] = obj[propertyName];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check if this instance is empty.
|
|
220
|
+
*
|
|
221
|
+
* @returns true or false
|
|
222
|
+
*/
|
|
223
|
+
empty() {
|
|
224
|
+
let check = true;
|
|
225
|
+
this && Object.keys(this).forEach(propertyName => {
|
|
226
|
+
if (this[propertyName] !== undefined && this[propertyName] !== null) {
|
|
227
|
+
check = false;
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
return check;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* GET property value from a string path.
|
|
234
|
+
*
|
|
235
|
+
* @param path String path
|
|
236
|
+
* @returns Value of the property
|
|
237
|
+
*/
|
|
238
|
+
get(path) {
|
|
239
|
+
let pathReplaced = path.replace(/\[(\w+)\]/g, '.$1');
|
|
240
|
+
let props = pathReplaced.split('.');
|
|
241
|
+
let rtn;
|
|
242
|
+
if (props?.length) {
|
|
243
|
+
rtn = this[props[0]];
|
|
244
|
+
for (let index in props) {
|
|
245
|
+
if (+index > 0)
|
|
246
|
+
rtn = rtn && rtn[props[index]];
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return rtn;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* SET property value from a string path.
|
|
253
|
+
*
|
|
254
|
+
* @param path String path
|
|
255
|
+
* @param value Value of the property
|
|
256
|
+
*/
|
|
257
|
+
set(path, value) {
|
|
258
|
+
path = path.replace(/\[(\w+)\]/g, '.$1');
|
|
259
|
+
let props = path.split('.');
|
|
260
|
+
let obj = this;
|
|
261
|
+
let i;
|
|
262
|
+
for (i = 0; i < props?.length - 1; i++) {
|
|
263
|
+
props?.[i] && (obj = obj?.[props?.[i]]);
|
|
264
|
+
}
|
|
265
|
+
props?.[i] && obj && (obj[props?.[i]] = value);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
exports.MapperFactory = MapperFactory;
|
|
269
|
+
/**
|
|
270
|
+
* @deprecated The method should not be used
|
|
271
|
+
*/
|
|
272
|
+
function MapperFactoryFun(baseClass = Object) {
|
|
273
|
+
class Mapper extends baseClass {
|
|
274
|
+
/**
|
|
275
|
+
* Constructor of the mapper.
|
|
276
|
+
*
|
|
277
|
+
* @param object object to be mapped considering metadata "src" and "transformer"
|
|
278
|
+
* @param rest other optional parameters
|
|
279
|
+
*/
|
|
280
|
+
constructor(object, ...rest) {
|
|
281
|
+
super(...rest);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return Mapper;
|
|
285
|
+
}
|
|
286
|
+
exports.MapperFactoryFun = MapperFactoryFun;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare type ClassType<Class = any> = {
|
|
2
|
+
new (...args: any[]): Class;
|
|
3
|
+
};
|
|
4
|
+
export declare type AnyFunction<A = any> = (...input: any[]) => A;
|
|
5
|
+
export declare type AnyConstructor<A = Record<string, unknown>> = new (...input: any[]) => A;
|
|
6
|
+
export declare type Mixin<T extends AnyFunction> = InstanceType<ReturnType<T>>;
|
package/dist/types.js
ADDED