@cratis/fundamentals 7.7.11 → 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.
- package/Field.ts +6 -1
- package/Fields.ts +2 -2
- package/JsonSerializer.ts +88 -1
- package/ValueMap.ts +46 -0
- package/dist/Field.d.ts +2 -1
- package/dist/Field.d.ts.map +1 -1
- package/dist/Field.js +3 -1
- package/dist/Field.js.map +1 -1
- package/dist/Fields.d.ts +1 -1
- package/dist/Fields.d.ts.map +1 -1
- package/dist/Fields.js +2 -2
- package/dist/Fields.js.map +1 -1
- package/dist/JsonSerializer.d.ts.map +1 -1
- package/dist/JsonSerializer.js +68 -1
- package/dist/JsonSerializer.js.map +1 -1
- package/dist/ValueMap.d.ts +8 -0
- package/dist/ValueMap.d.ts.map +1 -0
- package/dist/ValueMap.js +32 -0
- package/dist/ValueMap.js.map +1 -0
- package/dist/cjs/Field.d.ts +2 -1
- package/dist/cjs/Field.d.ts.map +1 -1
- package/dist/cjs/Field.js +3 -1
- package/dist/cjs/Field.js.map +1 -1
- package/dist/cjs/Fields.d.ts +1 -1
- package/dist/cjs/Fields.d.ts.map +1 -1
- package/dist/cjs/Fields.js +2 -2
- package/dist/cjs/Fields.js.map +1 -1
- package/dist/cjs/JsonSerializer.d.ts.map +1 -1
- package/dist/cjs/JsonSerializer.js +68 -1
- package/dist/cjs/JsonSerializer.js.map +1 -1
- package/dist/cjs/ValueMap.d.ts +8 -0
- package/dist/cjs/ValueMap.d.ts.map +1 -0
- package/dist/cjs/ValueMap.js +36 -0
- package/dist/cjs/ValueMap.js.map +1 -0
- package/dist/cjs/fieldDecorator.d.ts +7 -1
- package/dist/cjs/fieldDecorator.d.ts.map +1 -1
- package/dist/cjs/fieldDecorator.js +8 -2
- package/dist/cjs/fieldDecorator.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/Field.d.ts +2 -1
- package/dist/esm/Field.d.ts.map +1 -1
- package/dist/esm/Field.js +3 -1
- package/dist/esm/Field.js.map +1 -1
- package/dist/esm/Fields.d.ts +1 -1
- package/dist/esm/Fields.d.ts.map +1 -1
- package/dist/esm/Fields.js +2 -2
- package/dist/esm/Fields.js.map +1 -1
- package/dist/esm/JsonSerializer.d.ts.map +1 -1
- package/dist/esm/JsonSerializer.js +68 -1
- package/dist/esm/JsonSerializer.js.map +1 -1
- package/dist/esm/ValueMap.d.ts +8 -0
- package/dist/esm/ValueMap.d.ts.map +1 -0
- package/dist/esm/ValueMap.js +34 -0
- package/dist/esm/ValueMap.js.map +1 -0
- package/dist/esm/fieldDecorator.d.ts +7 -1
- package/dist/esm/fieldDecorator.d.ts.map +1 -1
- package/dist/esm/fieldDecorator.js +8 -2
- package/dist/esm/fieldDecorator.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/fieldDecorator.d.ts +7 -1
- package/dist/fieldDecorator.d.ts.map +1 -1
- package/dist/fieldDecorator.js +8 -2
- package/dist/fieldDecorator.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/fieldDecorator.ts +16 -2
- package/for_Fields/when_adding_fiields_to_type.ts +4 -3
- package/for_JsonSerializer/Types.ts +12 -0
- package/for_JsonSerializer/when_deserializing_object_with_value_map.ts +63 -0
- package/for_JsonSerializer/when_serializing_object_with_value_map.ts +34 -0
- package/index.ts +1 -0
- package/package.json +1 -1
package/Field.ts
CHANGED
|
@@ -7,6 +7,11 @@ import { Constructor } from './Constructor';
|
|
|
7
7
|
* Represents a field on a type.
|
|
8
8
|
*/
|
|
9
9
|
export class Field {
|
|
10
|
-
constructor(
|
|
10
|
+
constructor(
|
|
11
|
+
readonly name: string,
|
|
12
|
+
readonly type: Constructor,
|
|
13
|
+
readonly enumerable: boolean,
|
|
14
|
+
readonly derivatives: Constructor[],
|
|
15
|
+
readonly genericArguments: Constructor[]) {
|
|
11
16
|
}
|
|
12
17
|
}
|
package/Fields.ts
CHANGED
|
@@ -9,12 +9,12 @@ import { Field } from './Field';
|
|
|
9
9
|
* Represents a system working with fields on types.
|
|
10
10
|
*/
|
|
11
11
|
export class Fields {
|
|
12
|
-
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]) {
|
|
12
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]) {
|
|
13
13
|
let fields: Map<string, Field> = new Map<string, Field>();
|
|
14
14
|
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
15
15
|
fields = Reflect.getOwnMetadata('fields', target);
|
|
16
16
|
}
|
|
17
|
-
fields.set(field, new Field(field, fieldType, enumerable, derivatives));
|
|
17
|
+
fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));
|
|
18
18
|
Reflect.defineMetadata('fields', fields, target);
|
|
19
19
|
}
|
|
20
20
|
|
package/JsonSerializer.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { Field } from './Field';
|
|
|
7
7
|
import { Fields } from './Fields';
|
|
8
8
|
import { Guid } from './Guid';
|
|
9
9
|
import { TimeSpan } from './TimeSpan';
|
|
10
|
+
import { ValueMap } from './ValueMap';
|
|
10
11
|
|
|
11
12
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
12
13
|
|
|
@@ -18,7 +19,15 @@ const typeConverters: Map<Constructor, typeSerializer> = new Map<Constructor, ty
|
|
|
18
19
|
[Boolean, (value: boolean) => value],
|
|
19
20
|
[Date, (value: Date) => value.toISOString()],
|
|
20
21
|
[Guid, (value: Guid) => value?.toString() ?? ''],
|
|
21
|
-
[TimeSpan, (value: TimeSpan) => value?.toString() ?? '']
|
|
22
|
+
[TimeSpan, (value: TimeSpan) => value?.toString() ?? ''],
|
|
23
|
+
[ValueMap, (value: ValueMap<any, any>) => {
|
|
24
|
+
const converted: any = {};
|
|
25
|
+
for (const [key, mapValue] of value.entries()) {
|
|
26
|
+
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return converted;
|
|
30
|
+
}]
|
|
22
31
|
]);
|
|
23
32
|
|
|
24
33
|
const typeSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
|
|
@@ -49,6 +58,10 @@ const deserializeValueFromType = (type: Constructor, value: any) => {
|
|
|
49
58
|
};
|
|
50
59
|
|
|
51
60
|
const deserializeValueFromField = (field: Field, value: any) => {
|
|
61
|
+
if (field.type === ValueMap) {
|
|
62
|
+
return deserializeValueMapFromField(field, value);
|
|
63
|
+
}
|
|
64
|
+
|
|
52
65
|
if (typeSerializers.has(field.type)) {
|
|
53
66
|
return typeSerializers.get(field.type)!(value);
|
|
54
67
|
} else {
|
|
@@ -62,6 +75,80 @@ const deserializeValueFromField = (field: Field, value: any) => {
|
|
|
62
75
|
}
|
|
63
76
|
};
|
|
64
77
|
|
|
78
|
+
const serializeMapKey = (key: any): string => {
|
|
79
|
+
if (key === undefined || key === null) {
|
|
80
|
+
return '';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (typeof key === 'string') {
|
|
84
|
+
return key;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
|
|
88
|
+
return key.toString();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (key instanceof Date) {
|
|
92
|
+
return key.toISOString();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return JsonSerializer.serialize(key);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const deserializeMapKey = (keyType: Constructor, key: string): any => {
|
|
99
|
+
if (keyType === String) {
|
|
100
|
+
return key;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (keyType === Number) {
|
|
104
|
+
return Number(key);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (keyType === Boolean) {
|
|
108
|
+
return key.toLowerCase() === 'true';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (keyType === Date) {
|
|
112
|
+
return new Date(key);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (typeSerializers.has(keyType)) {
|
|
116
|
+
return typeSerializers.get(keyType)!(key);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return JsonSerializer.deserialize(keyType, key);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {
|
|
123
|
+
if (!valueType) {
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (typeSerializers.has(valueType)) {
|
|
128
|
+
return typeSerializers.get(valueType)!(value);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {
|
|
135
|
+
const valueMap = new ValueMap<any, any>();
|
|
136
|
+
const keyType = field.genericArguments[0];
|
|
137
|
+
const valueType = field.genericArguments[1];
|
|
138
|
+
|
|
139
|
+
if (!value || !keyType) {
|
|
140
|
+
return valueMap;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for (const key of Object.keys(value)) {
|
|
144
|
+
const deserializedKey = deserializeMapKey(keyType, key);
|
|
145
|
+
const deserializedValue = deserializeMapValue(valueType, value[key]);
|
|
146
|
+
valueMap.set(deserializedKey, deserializedValue);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return valueMap;
|
|
150
|
+
};
|
|
151
|
+
|
|
65
152
|
const convertTypesOnInstance = (instance: any) => {
|
|
66
153
|
if (typeConverters.has(instance.constructor)) {
|
|
67
154
|
return serializeValueForType(instance.constructor, instance);
|
package/ValueMap.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents a map that compares object keys by value.
|
|
8
|
+
*/
|
|
9
|
+
export class ValueMap<TKey, TValue> {
|
|
10
|
+
private readonly _entries: Array<[TKey, TValue]> = [];
|
|
11
|
+
|
|
12
|
+
set(key: TKey, value: TValue): this {
|
|
13
|
+
const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));
|
|
14
|
+
if (index >= 0) {
|
|
15
|
+
this._entries[index][1] = value;
|
|
16
|
+
} else {
|
|
17
|
+
this._entries.push([key, value]);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get(key: TKey): TValue | undefined {
|
|
24
|
+
return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
entries(): IterableIterator<[TKey, TValue]> {
|
|
28
|
+
return this._entries.values();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private equals(first: TKey, second: TKey): boolean {
|
|
32
|
+
if (first === second) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (first === undefined || first === null || second === undefined || second === null) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (typeof first === 'object' && typeof second === 'object') {
|
|
41
|
+
return JSON.stringify(first) === JSON.stringify(second);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
package/dist/Field.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare class Field {
|
|
|
4
4
|
readonly type: Constructor;
|
|
5
5
|
readonly enumerable: boolean;
|
|
6
6
|
readonly derivatives: Constructor[];
|
|
7
|
-
|
|
7
|
+
readonly genericArguments: Constructor[];
|
|
8
|
+
constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]);
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=Field.d.ts.map
|
package/dist/Field.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;IACnC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE;gBAJ/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,WAAW,EAAE,EAC1B,gBAAgB,EAAE,WAAW,EAAE;CAE/C"}
|
package/dist/Field.js
CHANGED
|
@@ -3,11 +3,13 @@ export class Field {
|
|
|
3
3
|
type;
|
|
4
4
|
enumerable;
|
|
5
5
|
derivatives;
|
|
6
|
-
|
|
6
|
+
genericArguments;
|
|
7
|
+
constructor(name, type, enumerable, derivatives, genericArguments) {
|
|
7
8
|
this.name = name;
|
|
8
9
|
this.type = type;
|
|
9
10
|
this.enumerable = enumerable;
|
|
10
11
|
this.derivatives = derivatives;
|
|
12
|
+
this.genericArguments = genericArguments;
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=Field.js.map
|
package/dist/Field.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAQC,MAAM,OAAO,KAAK;
|
|
1
|
+
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAQC,MAAM,OAAO,KAAK;IAEF;IACA;IACA;IACA;IACA;IALb,YACa,IAAY,EACZ,IAAiB,EACjB,UAAmB,EACnB,WAA0B,EAC1B,gBAA+B;QAJ/B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAa;QACjB,eAAU,GAAV,UAAU,CAAS;QACnB,gBAAW,GAAX,WAAW,CAAe;QAC1B,qBAAgB,GAAhB,gBAAgB,CAAe;IAC5C,CAAC;CACJ"}
|
package/dist/Fields.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import { Constructor } from './Constructor';
|
|
3
3
|
import { Field } from './Field';
|
|
4
4
|
export declare class Fields {
|
|
5
|
-
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
|
|
5
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]): void;
|
|
6
6
|
static getFieldsForType(target: Constructor): Field[];
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=Fields.d.ts.map
|
package/dist/Fields.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE;IASlK,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
|
package/dist/Fields.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { Field } from './Field';
|
|
3
3
|
export class Fields {
|
|
4
|
-
static addFieldToType(target, field, fieldType, enumerable, derivatives) {
|
|
4
|
+
static addFieldToType(target, field, fieldType, enumerable, derivatives, genericArguments) {
|
|
5
5
|
let fields = new Map();
|
|
6
6
|
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
7
7
|
fields = Reflect.getOwnMetadata('fields', target);
|
|
8
8
|
}
|
|
9
|
-
fields.set(field, new Field(field, fieldType, enumerable, derivatives));
|
|
9
|
+
fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));
|
|
10
10
|
Reflect.defineMetadata('fields', fields, target);
|
|
11
11
|
}
|
|
12
12
|
static getFieldsForType(target) {
|
package/dist/Fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.js","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,OAAO,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B;
|
|
1
|
+
{"version":3,"file":"Fields.js","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,OAAO,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAE,gBAA+B;QAC9J,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB,CAAC;QAC1D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAmB;QACvC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8K5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAOjE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAwChH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
|
package/dist/JsonSerializer.js
CHANGED
|
@@ -2,13 +2,21 @@ import { DerivedType } from './DerivedType';
|
|
|
2
2
|
import { Fields } from './Fields';
|
|
3
3
|
import { Guid } from './Guid';
|
|
4
4
|
import { TimeSpan } from './TimeSpan';
|
|
5
|
+
import { ValueMap } from './ValueMap';
|
|
5
6
|
const typeConverters = new Map([
|
|
6
7
|
[Number, (value) => value],
|
|
7
8
|
[String, (value) => value],
|
|
8
9
|
[Boolean, (value) => value],
|
|
9
10
|
[Date, (value) => value.toISOString()],
|
|
10
11
|
[Guid, (value) => value?.toString() ?? ''],
|
|
11
|
-
[TimeSpan, (value) => value?.toString() ?? '']
|
|
12
|
+
[TimeSpan, (value) => value?.toString() ?? ''],
|
|
13
|
+
[ValueMap, (value) => {
|
|
14
|
+
const converted = {};
|
|
15
|
+
for (const [key, mapValue] of value.entries()) {
|
|
16
|
+
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
17
|
+
}
|
|
18
|
+
return converted;
|
|
19
|
+
}]
|
|
12
20
|
]);
|
|
13
21
|
const typeSerializers = new Map([
|
|
14
22
|
[Number, (value) => value],
|
|
@@ -37,6 +45,9 @@ const deserializeValueFromType = (type, value) => {
|
|
|
37
45
|
}
|
|
38
46
|
};
|
|
39
47
|
const deserializeValueFromField = (field, value) => {
|
|
48
|
+
if (field.type === ValueMap) {
|
|
49
|
+
return deserializeValueMapFromField(field, value);
|
|
50
|
+
}
|
|
40
51
|
if (typeSerializers.has(field.type)) {
|
|
41
52
|
return typeSerializers.get(field.type)(value);
|
|
42
53
|
}
|
|
@@ -49,6 +60,62 @@ const deserializeValueFromField = (field, value) => {
|
|
|
49
60
|
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
50
61
|
}
|
|
51
62
|
};
|
|
63
|
+
const serializeMapKey = (key) => {
|
|
64
|
+
if (key === undefined || key === null) {
|
|
65
|
+
return '';
|
|
66
|
+
}
|
|
67
|
+
if (typeof key === 'string') {
|
|
68
|
+
return key;
|
|
69
|
+
}
|
|
70
|
+
if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
|
|
71
|
+
return key.toString();
|
|
72
|
+
}
|
|
73
|
+
if (key instanceof Date) {
|
|
74
|
+
return key.toISOString();
|
|
75
|
+
}
|
|
76
|
+
return JsonSerializer.serialize(key);
|
|
77
|
+
};
|
|
78
|
+
const deserializeMapKey = (keyType, key) => {
|
|
79
|
+
if (keyType === String) {
|
|
80
|
+
return key;
|
|
81
|
+
}
|
|
82
|
+
if (keyType === Number) {
|
|
83
|
+
return Number(key);
|
|
84
|
+
}
|
|
85
|
+
if (keyType === Boolean) {
|
|
86
|
+
return key.toLowerCase() === 'true';
|
|
87
|
+
}
|
|
88
|
+
if (keyType === Date) {
|
|
89
|
+
return new Date(key);
|
|
90
|
+
}
|
|
91
|
+
if (typeSerializers.has(keyType)) {
|
|
92
|
+
return typeSerializers.get(keyType)(key);
|
|
93
|
+
}
|
|
94
|
+
return JsonSerializer.deserialize(keyType, key);
|
|
95
|
+
};
|
|
96
|
+
const deserializeMapValue = (valueType, value) => {
|
|
97
|
+
if (!valueType) {
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
if (typeSerializers.has(valueType)) {
|
|
101
|
+
return typeSerializers.get(valueType)(value);
|
|
102
|
+
}
|
|
103
|
+
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
104
|
+
};
|
|
105
|
+
const deserializeValueMapFromField = (field, value) => {
|
|
106
|
+
const valueMap = new ValueMap();
|
|
107
|
+
const keyType = field.genericArguments[0];
|
|
108
|
+
const valueType = field.genericArguments[1];
|
|
109
|
+
if (!value || !keyType) {
|
|
110
|
+
return valueMap;
|
|
111
|
+
}
|
|
112
|
+
for (const key of Object.keys(value)) {
|
|
113
|
+
const deserializedKey = deserializeMapKey(keyType, key);
|
|
114
|
+
const deserializedValue = deserializeMapValue(valueType, value[key]);
|
|
115
|
+
valueMap.set(deserializedKey, deserializedValue);
|
|
116
|
+
}
|
|
117
|
+
return valueMap;
|
|
118
|
+
};
|
|
52
119
|
const convertTypesOnInstance = (instance) => {
|
|
53
120
|
if (typeConverters.has(instance.constructor)) {
|
|
54
121
|
return serializeValueForType(instance.constructor, instance);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMtC,MAAM,cAAc,GAAqC,IAAI,GAAG,CAA8B;IAC1F,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC;IACpC,CAAC,IAAI,EAAE,CAAC,KAAW,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC,IAAI,EAAE,CAAC,KAAW,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueMap.d.ts","sourceRoot":"","sources":["../ValueMap.ts"],"names":[],"mappings":"AAQA,qBAAa,QAAQ,CAAC,IAAI,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAIlC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,OAAO,CAAC,MAAM;CAejB"}
|
package/dist/ValueMap.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class ValueMap {
|
|
2
|
+
_entries = [];
|
|
3
|
+
set(key, value) {
|
|
4
|
+
const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));
|
|
5
|
+
if (index >= 0) {
|
|
6
|
+
this._entries[index][1] = value;
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
this._entries.push([key, value]);
|
|
10
|
+
}
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
get(key) {
|
|
14
|
+
return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];
|
|
15
|
+
}
|
|
16
|
+
entries() {
|
|
17
|
+
return this._entries.values();
|
|
18
|
+
}
|
|
19
|
+
equals(first, second) {
|
|
20
|
+
if (first === second) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (first === undefined || first === null || second === undefined || second === null) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (typeof first === 'object' && typeof second === 'object') {
|
|
27
|
+
return JSON.stringify(first) === JSON.stringify(second);
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ValueMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueMap.js","sourceRoot":"","sources":["../ValueMap.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,QAAQ;IACA,QAAQ,GAA0B,EAAE,CAAC;IAEtD,GAAG,CAAC,GAAS,EAAE,KAAa;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QACxF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAS;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,KAAW,EAAE,MAAY;QACpC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACnF,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
|
package/dist/cjs/Field.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare class Field {
|
|
|
4
4
|
readonly type: Constructor;
|
|
5
5
|
readonly enumerable: boolean;
|
|
6
6
|
readonly derivatives: Constructor[];
|
|
7
|
-
|
|
7
|
+
readonly genericArguments: Constructor[];
|
|
8
|
+
constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]);
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=Field.d.ts.map
|
package/dist/cjs/Field.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;IACnC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE;gBAJ/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,WAAW,EAAE,EAC1B,gBAAgB,EAAE,WAAW,EAAE;CAE/C"}
|
package/dist/cjs/Field.js
CHANGED
|
@@ -5,11 +5,13 @@ class Field {
|
|
|
5
5
|
type;
|
|
6
6
|
enumerable;
|
|
7
7
|
derivatives;
|
|
8
|
-
|
|
8
|
+
genericArguments;
|
|
9
|
+
constructor(name, type, enumerable, derivatives, genericArguments) {
|
|
9
10
|
this.name = name;
|
|
10
11
|
this.type = type;
|
|
11
12
|
this.enumerable = enumerable;
|
|
12
13
|
this.derivatives = derivatives;
|
|
14
|
+
this.genericArguments = genericArguments;
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
|
package/dist/cjs/Field.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","sources":["../../Field.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\n\n/**\n * Represents a field on a type.\n */\n export class Field {\n constructor(readonly name: string
|
|
1
|
+
{"version":3,"file":"Field.js","sources":["../../Field.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\n\n/**\n * Represents a field on a type.\n */\n export class Field {\n constructor(\n readonly name: string,\n readonly type: Constructor,\n readonly enumerable: boolean,\n readonly derivatives: Constructor[],\n readonly genericArguments: Constructor[]) {\n }\n}\n"],"names":[],"mappings":";;MAQc,KAAK,CAAA;AAEF,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,gBAAA;IALb,WAAA,CACa,IAAY,EACZ,IAAiB,EACjB,UAAmB,EACnB,WAA0B,EAC1B,gBAA+B,EAAA;QAJ/B,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAC7B;AACH;;;;"}
|
package/dist/cjs/Fields.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import { Constructor } from './Constructor';
|
|
3
3
|
import { Field } from './Field';
|
|
4
4
|
export declare class Fields {
|
|
5
|
-
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
|
|
5
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]): void;
|
|
6
6
|
static getFieldsForType(target: Constructor): Field[];
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=Fields.d.ts.map
|
package/dist/cjs/Fields.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE;IASlK,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
|
package/dist/cjs/Fields.js
CHANGED
|
@@ -4,12 +4,12 @@ require('reflect-metadata');
|
|
|
4
4
|
var Field = require('./Field.js');
|
|
5
5
|
|
|
6
6
|
class Fields {
|
|
7
|
-
static addFieldToType(target, field, fieldType, enumerable, derivatives) {
|
|
7
|
+
static addFieldToType(target, field, fieldType, enumerable, derivatives, genericArguments) {
|
|
8
8
|
let fields = new Map();
|
|
9
9
|
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
10
10
|
fields = Reflect.getOwnMetadata('fields', target);
|
|
11
11
|
}
|
|
12
|
-
fields.set(field, new Field.Field(field, fieldType, enumerable, derivatives));
|
|
12
|
+
fields.set(field, new Field.Field(field, fieldType, enumerable, derivatives, genericArguments));
|
|
13
13
|
Reflect.defineMetadata('fields', fields, target);
|
|
14
14
|
}
|
|
15
15
|
static getFieldsForType(target) {
|
package/dist/cjs/Fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.js","sources":["../../Fields.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport 'reflect-metadata';\nimport { Constructor } from './Constructor';\nimport { Field } from './Field';\n\n/**\n * Represents a system working with fields on types.\n */\nexport class Fields {\n static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]) {\n let fields: Map<string, Field> = new Map<string, Field>();\n if (Reflect.hasOwnMetadata('fields', target)) {\n fields = Reflect.getOwnMetadata('fields', target);\n }\n fields.set(field, new Field(field, fieldType, enumerable, derivatives));\n Reflect.defineMetadata('fields', fields, target);\n }\n\n static getFieldsForType(target: Constructor): Field[] {\n const fields: Field[] = [];\n if (Reflect.hasOwnMetadata('fields', target)) {\n const fieldsMap = Reflect.getOwnMetadata('fields', target) as Map<string, Field>;\n for (const field of fieldsMap.entries()) {\n fields.push(field[1]);\n }\n }\n\n return fields;\n }\n}\n"],"names":["Field"],"mappings":";;;;;MAUa,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"Fields.js","sources":["../../Fields.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport 'reflect-metadata';\nimport { Constructor } from './Constructor';\nimport { Field } from './Field';\n\n/**\n * Represents a system working with fields on types.\n */\nexport class Fields {\n static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]) {\n let fields: Map<string, Field> = new Map<string, Field>();\n if (Reflect.hasOwnMetadata('fields', target)) {\n fields = Reflect.getOwnMetadata('fields', target);\n }\n fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));\n Reflect.defineMetadata('fields', fields, target);\n }\n\n static getFieldsForType(target: Constructor): Field[] {\n const fields: Field[] = [];\n if (Reflect.hasOwnMetadata('fields', target)) {\n const fieldsMap = Reflect.getOwnMetadata('fields', target) as Map<string, Field>;\n for (const field of fieldsMap.entries()) {\n fields.push(field[1]);\n }\n }\n\n return fields;\n }\n}\n"],"names":["Field"],"mappings":";;;;;MAUa,MAAM,CAAA;AACf,IAAA,OAAO,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAE,gBAA+B,EAAA;AAC9J,QAAA,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB;QACzD,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;QACrD;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIA,WAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACzF,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;IACpD;IAEA,OAAO,gBAAgB,CAAC,MAAmB,EAAA;QACvC,MAAM,MAAM,GAAY,EAAE;QAC1B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB;YAChF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB;QACJ;AAEA,QAAA,OAAO,MAAM;IACjB;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8K5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAOjE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAwChH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
|
|
@@ -4,6 +4,7 @@ var DerivedType = require('./DerivedType.js');
|
|
|
4
4
|
var Fields = require('./Fields.js');
|
|
5
5
|
var Guid = require('./Guid.js');
|
|
6
6
|
var TimeSpan = require('./TimeSpan.js');
|
|
7
|
+
var ValueMap = require('./ValueMap.js');
|
|
7
8
|
|
|
8
9
|
const typeConverters = new Map([
|
|
9
10
|
[Number, (value) => value],
|
|
@@ -11,7 +12,14 @@ const typeConverters = new Map([
|
|
|
11
12
|
[Boolean, (value) => value],
|
|
12
13
|
[Date, (value) => value.toISOString()],
|
|
13
14
|
[Guid.Guid, (value) => value?.toString() ?? ''],
|
|
14
|
-
[TimeSpan.TimeSpan, (value) => value?.toString() ?? '']
|
|
15
|
+
[TimeSpan.TimeSpan, (value) => value?.toString() ?? ''],
|
|
16
|
+
[ValueMap.ValueMap, (value) => {
|
|
17
|
+
const converted = {};
|
|
18
|
+
for (const [key, mapValue] of value.entries()) {
|
|
19
|
+
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
20
|
+
}
|
|
21
|
+
return converted;
|
|
22
|
+
}]
|
|
15
23
|
]);
|
|
16
24
|
const typeSerializers = new Map([
|
|
17
25
|
[Number, (value) => value],
|
|
@@ -40,6 +48,9 @@ const deserializeValueFromType = (type, value) => {
|
|
|
40
48
|
}
|
|
41
49
|
};
|
|
42
50
|
const deserializeValueFromField = (field, value) => {
|
|
51
|
+
if (field.type === ValueMap.ValueMap) {
|
|
52
|
+
return deserializeValueMapFromField(field, value);
|
|
53
|
+
}
|
|
43
54
|
if (typeSerializers.has(field.type)) {
|
|
44
55
|
return typeSerializers.get(field.type)(value);
|
|
45
56
|
}
|
|
@@ -52,6 +63,62 @@ const deserializeValueFromField = (field, value) => {
|
|
|
52
63
|
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
53
64
|
}
|
|
54
65
|
};
|
|
66
|
+
const serializeMapKey = (key) => {
|
|
67
|
+
if (key === undefined || key === null) {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
if (typeof key === 'string') {
|
|
71
|
+
return key;
|
|
72
|
+
}
|
|
73
|
+
if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
|
|
74
|
+
return key.toString();
|
|
75
|
+
}
|
|
76
|
+
if (key instanceof Date) {
|
|
77
|
+
return key.toISOString();
|
|
78
|
+
}
|
|
79
|
+
return JsonSerializer.serialize(key);
|
|
80
|
+
};
|
|
81
|
+
const deserializeMapKey = (keyType, key) => {
|
|
82
|
+
if (keyType === String) {
|
|
83
|
+
return key;
|
|
84
|
+
}
|
|
85
|
+
if (keyType === Number) {
|
|
86
|
+
return Number(key);
|
|
87
|
+
}
|
|
88
|
+
if (keyType === Boolean) {
|
|
89
|
+
return key.toLowerCase() === 'true';
|
|
90
|
+
}
|
|
91
|
+
if (keyType === Date) {
|
|
92
|
+
return new Date(key);
|
|
93
|
+
}
|
|
94
|
+
if (typeSerializers.has(keyType)) {
|
|
95
|
+
return typeSerializers.get(keyType)(key);
|
|
96
|
+
}
|
|
97
|
+
return JsonSerializer.deserialize(keyType, key);
|
|
98
|
+
};
|
|
99
|
+
const deserializeMapValue = (valueType, value) => {
|
|
100
|
+
if (!valueType) {
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
if (typeSerializers.has(valueType)) {
|
|
104
|
+
return typeSerializers.get(valueType)(value);
|
|
105
|
+
}
|
|
106
|
+
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
107
|
+
};
|
|
108
|
+
const deserializeValueMapFromField = (field, value) => {
|
|
109
|
+
const valueMap = new ValueMap.ValueMap();
|
|
110
|
+
const keyType = field.genericArguments[0];
|
|
111
|
+
const valueType = field.genericArguments[1];
|
|
112
|
+
if (!value || !keyType) {
|
|
113
|
+
return valueMap;
|
|
114
|
+
}
|
|
115
|
+
for (const key of Object.keys(value)) {
|
|
116
|
+
const deserializedKey = deserializeMapKey(keyType, key);
|
|
117
|
+
const deserializedValue = deserializeMapValue(valueType, value[key]);
|
|
118
|
+
valueMap.set(deserializedKey, deserializedValue);
|
|
119
|
+
}
|
|
120
|
+
return valueMap;
|
|
121
|
+
};
|
|
55
122
|
const convertTypesOnInstance = (instance) => {
|
|
56
123
|
if (typeConverters.has(instance.constructor)) {
|
|
57
124
|
return serializeValueForType(instance.constructor, instance);
|