@cratis/fundamentals 7.14.0 → 7.15.1
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/JsonSerializer.ts +88 -42
- package/README.md +10 -0
- package/dist/JsonSerializer.d.ts.map +1 -1
- package/dist/JsonSerializer.js +50 -40
- package/dist/JsonSerializer.js.map +1 -1
- package/dist/cjs/JsonSerializer.d.ts.map +1 -1
- package/dist/cjs/JsonSerializer.js +56 -40
- package/dist/cjs/JsonSerializer.js.map +1 -1
- package/dist/cjs/geospatial/LineString.d.ts +7 -0
- package/dist/cjs/geospatial/LineString.d.ts.map +1 -0
- package/dist/cjs/geospatial/LineString.js +20 -0
- package/dist/cjs/geospatial/LineString.js.map +1 -0
- package/dist/cjs/geospatial/LinearRing.d.ts +7 -0
- package/dist/cjs/geospatial/LinearRing.d.ts.map +1 -0
- package/dist/cjs/geospatial/LinearRing.js +17 -0
- package/dist/cjs/geospatial/LinearRing.js.map +1 -0
- package/dist/cjs/geospatial/Point.d.ts +7 -0
- package/dist/cjs/geospatial/Point.d.ts.map +1 -0
- package/dist/cjs/geospatial/Point.js +30 -0
- package/dist/cjs/geospatial/Point.js.map +1 -0
- package/dist/cjs/geospatial/Polygon.d.ts +8 -0
- package/dist/cjs/geospatial/Polygon.d.ts.map +1 -0
- package/dist/cjs/geospatial/Polygon.js +23 -0
- package/dist/cjs/geospatial/Polygon.js.map +1 -0
- package/dist/cjs/geospatial/index.d.ts +5 -0
- package/dist/cjs/geospatial/index.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/json/DateJsonConverter.d.ts +8 -0
- package/dist/cjs/json/DateJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/DateJsonConverter.js +18 -0
- package/dist/cjs/json/DateJsonConverter.js.map +1 -0
- package/dist/cjs/json/GuidJsonConverter.d.ts +9 -0
- package/dist/cjs/json/GuidJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/GuidJsonConverter.js +19 -0
- package/dist/cjs/json/GuidJsonConverter.js.map +1 -0
- package/dist/cjs/json/JsonConverter.d.ts +8 -0
- package/dist/cjs/json/JsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/JsonConverter.js +10 -0
- package/dist/cjs/json/JsonConverter.js.map +1 -0
- package/dist/cjs/json/LineStringJsonConverter.d.ts +9 -0
- package/dist/cjs/json/LineStringJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/LineStringJsonConverter.js +27 -0
- package/dist/cjs/json/LineStringJsonConverter.js.map +1 -0
- package/dist/cjs/json/PointJsonConverter.d.ts +9 -0
- package/dist/cjs/json/PointJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/PointJsonConverter.js +25 -0
- package/dist/cjs/json/PointJsonConverter.js.map +1 -0
- package/dist/cjs/json/PolygonJsonConverter.d.ts +9 -0
- package/dist/cjs/json/PolygonJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/PolygonJsonConverter.js +29 -0
- package/dist/cjs/json/PolygonJsonConverter.js.map +1 -0
- package/dist/cjs/json/TimeSpanJsonConverter.d.ts +9 -0
- package/dist/cjs/json/TimeSpanJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/TimeSpanJsonConverter.js +19 -0
- package/dist/cjs/json/TimeSpanJsonConverter.js.map +1 -0
- package/dist/cjs/json/ValueMapJsonConverter.d.ts +12 -0
- package/dist/cjs/json/ValueMapJsonConverter.d.ts.map +1 -0
- package/dist/cjs/json/ValueMapJsonConverter.js +33 -0
- package/dist/cjs/json/ValueMapJsonConverter.js.map +1 -0
- package/dist/cjs/json/index.d.ts +9 -0
- package/dist/cjs/json/index.d.ts.map +1 -0
- package/dist/esm/JsonSerializer.d.ts.map +1 -1
- package/dist/esm/JsonSerializer.js +56 -40
- package/dist/esm/JsonSerializer.js.map +1 -1
- package/dist/esm/geospatial/LineString.d.ts +7 -0
- package/dist/esm/geospatial/LineString.d.ts.map +1 -0
- package/dist/esm/geospatial/LineString.js +18 -0
- package/dist/esm/geospatial/LineString.js.map +1 -0
- package/dist/esm/geospatial/LinearRing.d.ts +7 -0
- package/dist/esm/geospatial/LinearRing.d.ts.map +1 -0
- package/dist/esm/geospatial/LinearRing.js +15 -0
- package/dist/esm/geospatial/LinearRing.js.map +1 -0
- package/dist/esm/geospatial/Point.d.ts +7 -0
- package/dist/esm/geospatial/Point.d.ts.map +1 -0
- package/dist/esm/geospatial/Point.js +28 -0
- package/dist/esm/geospatial/Point.js.map +1 -0
- package/dist/esm/geospatial/Polygon.d.ts +8 -0
- package/dist/esm/geospatial/Polygon.d.ts.map +1 -0
- package/dist/esm/geospatial/Polygon.js +21 -0
- package/dist/esm/geospatial/Polygon.js.map +1 -0
- package/dist/esm/geospatial/index.d.ts +5 -0
- package/dist/esm/geospatial/index.d.ts.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/json/DateJsonConverter.d.ts +8 -0
- package/dist/esm/json/DateJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/DateJsonConverter.js +16 -0
- package/dist/esm/json/DateJsonConverter.js.map +1 -0
- package/dist/esm/json/GuidJsonConverter.d.ts +9 -0
- package/dist/esm/json/GuidJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/GuidJsonConverter.js +17 -0
- package/dist/esm/json/GuidJsonConverter.js.map +1 -0
- package/dist/esm/json/JsonConverter.d.ts +8 -0
- package/dist/esm/json/JsonConverter.d.ts.map +1 -0
- package/dist/esm/json/JsonConverter.js +8 -0
- package/dist/esm/json/JsonConverter.js.map +1 -0
- package/dist/esm/json/LineStringJsonConverter.d.ts +9 -0
- package/dist/esm/json/LineStringJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/LineStringJsonConverter.js +25 -0
- package/dist/esm/json/LineStringJsonConverter.js.map +1 -0
- package/dist/esm/json/PointJsonConverter.d.ts +9 -0
- package/dist/esm/json/PointJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/PointJsonConverter.js +23 -0
- package/dist/esm/json/PointJsonConverter.js.map +1 -0
- package/dist/esm/json/PolygonJsonConverter.d.ts +9 -0
- package/dist/esm/json/PolygonJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/PolygonJsonConverter.js +27 -0
- package/dist/esm/json/PolygonJsonConverter.js.map +1 -0
- package/dist/esm/json/TimeSpanJsonConverter.d.ts +9 -0
- package/dist/esm/json/TimeSpanJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/TimeSpanJsonConverter.js +17 -0
- package/dist/esm/json/TimeSpanJsonConverter.js.map +1 -0
- package/dist/esm/json/ValueMapJsonConverter.d.ts +12 -0
- package/dist/esm/json/ValueMapJsonConverter.d.ts.map +1 -0
- package/dist/esm/json/ValueMapJsonConverter.js +31 -0
- package/dist/esm/json/ValueMapJsonConverter.js.map +1 -0
- package/dist/esm/json/index.d.ts +9 -0
- package/dist/esm/json/index.d.ts.map +1 -0
- package/dist/geospatial/LineString.d.ts +7 -0
- package/dist/geospatial/LineString.d.ts.map +1 -0
- package/dist/geospatial/LineString.js +16 -0
- package/dist/geospatial/LineString.js.map +1 -0
- package/dist/geospatial/LinearRing.d.ts +7 -0
- package/dist/geospatial/LinearRing.d.ts.map +1 -0
- package/dist/geospatial/LinearRing.js +13 -0
- package/dist/geospatial/LinearRing.js.map +1 -0
- package/dist/geospatial/Point.d.ts +7 -0
- package/dist/geospatial/Point.d.ts.map +1 -0
- package/dist/geospatial/Point.js +25 -0
- package/dist/geospatial/Point.js.map +1 -0
- package/dist/geospatial/Polygon.d.ts +8 -0
- package/dist/geospatial/Polygon.d.ts.map +1 -0
- package/dist/geospatial/Polygon.js +19 -0
- package/dist/geospatial/Polygon.js.map +1 -0
- package/dist/geospatial/index.d.ts +5 -0
- package/dist/geospatial/index.d.ts.map +1 -0
- package/dist/geospatial/index.js +5 -0
- package/dist/geospatial/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/json/DateJsonConverter.d.ts +8 -0
- package/dist/json/DateJsonConverter.d.ts.map +1 -0
- package/dist/json/DateJsonConverter.js +13 -0
- package/dist/json/DateJsonConverter.js.map +1 -0
- package/dist/json/GuidJsonConverter.d.ts +9 -0
- package/dist/json/GuidJsonConverter.d.ts.map +1 -0
- package/dist/json/GuidJsonConverter.js +14 -0
- package/dist/json/GuidJsonConverter.js.map +1 -0
- package/dist/json/JsonConverter.d.ts +8 -0
- package/dist/json/JsonConverter.d.ts.map +1 -0
- package/dist/json/JsonConverter.js +6 -0
- package/dist/json/JsonConverter.js.map +1 -0
- package/dist/json/LineStringJsonConverter.d.ts +9 -0
- package/dist/json/LineStringJsonConverter.d.ts.map +1 -0
- package/dist/json/LineStringJsonConverter.js +21 -0
- package/dist/json/LineStringJsonConverter.js.map +1 -0
- package/dist/json/PointJsonConverter.d.ts +9 -0
- package/dist/json/PointJsonConverter.d.ts.map +1 -0
- package/dist/json/PointJsonConverter.js +20 -0
- package/dist/json/PointJsonConverter.js.map +1 -0
- package/dist/json/PolygonJsonConverter.d.ts +9 -0
- package/dist/json/PolygonJsonConverter.d.ts.map +1 -0
- package/dist/json/PolygonJsonConverter.js +22 -0
- package/dist/json/PolygonJsonConverter.js.map +1 -0
- package/dist/json/TimeSpanJsonConverter.d.ts +9 -0
- package/dist/json/TimeSpanJsonConverter.d.ts.map +1 -0
- package/dist/json/TimeSpanJsonConverter.js +14 -0
- package/dist/json/TimeSpanJsonConverter.js.map +1 -0
- package/dist/json/ValueMapJsonConverter.d.ts +12 -0
- package/dist/json/ValueMapJsonConverter.d.ts.map +1 -0
- package/dist/json/ValueMapJsonConverter.js +28 -0
- package/dist/json/ValueMapJsonConverter.js.map +1 -0
- package/dist/json/index.d.ts +9 -0
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +9 -0
- package/dist/json/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/geospatial/LineString.ts +33 -0
- package/geospatial/LinearRing.ts +30 -0
- package/geospatial/Point.ts +36 -0
- package/geospatial/Polygon.ts +37 -0
- package/geospatial/index.ts +7 -0
- package/index.ts +2 -0
- package/json/DateJsonConverter.ts +27 -0
- package/json/GuidJsonConverter.ts +28 -0
- package/json/JsonConverter.ts +40 -0
- package/json/LineStringJsonConverter.ts +35 -0
- package/json/PointJsonConverter.ts +34 -0
- package/json/PolygonJsonConverter.ts +38 -0
- package/json/TimeSpanJsonConverter.ts +28 -0
- package/json/ValueMapJsonConverter.ts +57 -0
- package/json/for_DateJsonConverter/when_reading_date_with_date_converter.ts +12 -0
- package/json/for_DateJsonConverter/when_writing_date_with_date_converter.ts +12 -0
- package/json/for_GuidJsonConverter/when_reading_guid_with_guid_converter.ts +13 -0
- package/json/for_GuidJsonConverter/when_writing_guid_with_guid_converter.ts +13 -0
- package/json/for_LineStringJsonConverter/when_deserializing_linestring.ts +19 -0
- package/json/for_LineStringJsonConverter/when_reading_linestring_with_linestring_converter.ts +24 -0
- package/json/for_LineStringJsonConverter/when_serializing_linestring.ts +25 -0
- package/json/for_LineStringJsonConverter/when_writing_linestring_with_linestring_converter.ts +27 -0
- package/json/for_PointJsonConverter/when_deserializing_point.ts +14 -0
- package/json/for_PointJsonConverter/when_reading_point_with_point_converter.ts +14 -0
- package/json/for_PointJsonConverter/when_serializing_point.ts +17 -0
- package/json/for_PointJsonConverter/when_writing_point_with_point_converter.ts +16 -0
- package/json/for_PolygonJsonConverter/when_deserializing_polygon_with_holes.ts +28 -0
- package/json/for_PolygonJsonConverter/when_deserializing_polygon_with_no_holes.ts +22 -0
- package/json/for_PolygonJsonConverter/when_reading_polygon_with_polygon_converter.ts +27 -0
- package/json/for_PolygonJsonConverter/when_serializing_polygon_with_holes.ts +53 -0
- package/json/for_PolygonJsonConverter/when_serializing_polygon_with_no_holes.ts +33 -0
- package/json/for_PolygonJsonConverter/when_writing_polygon_with_polygon_converter.ts +35 -0
- package/json/for_TimeSpanJsonConverter/when_reading_timespan_with_timespan_converter.ts +16 -0
- package/json/for_TimeSpanJsonConverter/when_writing_timespan_with_timespan_converter.ts +13 -0
- package/json/for_ValueMapJsonConverter/when_writing_valuemap_with_valuemap_converter.ts +28 -0
- package/json/index.ts +11 -0
- package/package.json +11 -1
package/JsonSerializer.ts
CHANGED
|
@@ -6,38 +6,53 @@ import { Constructor } from './Constructor';
|
|
|
6
6
|
import { DerivedType } from './DerivedType';
|
|
7
7
|
import { Field } from './Field';
|
|
8
8
|
import { Fields } from './Fields';
|
|
9
|
-
import { Guid } from './Guid';
|
|
10
|
-
import { TimeSpan } from './TimeSpan';
|
|
11
9
|
import { ValueMap } from './ValueMap';
|
|
10
|
+
import {
|
|
11
|
+
JsonConverter,
|
|
12
|
+
DateJsonConverter,
|
|
13
|
+
GuidJsonConverter,
|
|
14
|
+
TimeSpanJsonConverter,
|
|
15
|
+
PointJsonConverter,
|
|
16
|
+
LineStringJsonConverter,
|
|
17
|
+
PolygonJsonConverter,
|
|
18
|
+
ValueMapJsonConverter
|
|
19
|
+
} from './json';
|
|
12
20
|
|
|
13
21
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
14
22
|
|
|
15
23
|
type typeSerializer = (value: any) => any;
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
// Initialize converters
|
|
26
|
+
const converters: JsonConverter[] = [
|
|
27
|
+
new DateJsonConverter(),
|
|
28
|
+
new GuidJsonConverter(),
|
|
29
|
+
new TimeSpanJsonConverter(),
|
|
30
|
+
new PointJsonConverter(),
|
|
31
|
+
new LineStringJsonConverter(),
|
|
32
|
+
new PolygonJsonConverter(),
|
|
33
|
+
new ValueMapJsonConverter()
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
// Build converter maps from the converters
|
|
37
|
+
const typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();
|
|
38
|
+
const typeSerializers: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();
|
|
39
|
+
|
|
40
|
+
for (const converter of converters) {
|
|
41
|
+
typeConverters.set(converter.type, converter);
|
|
42
|
+
typeSerializers.set(converter.type, converter);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Add primitive type converters that don't need a full JsonConverter class
|
|
46
|
+
const primitiveConverters: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
|
|
18
47
|
[Number, (value: number) => value],
|
|
19
48
|
[String, (value: string) => value],
|
|
20
|
-
[Boolean, (value: boolean) => value]
|
|
21
|
-
[Date, (value: Date) => value.toISOString()],
|
|
22
|
-
[Guid, (value: Guid) => value?.toString() ?? ''],
|
|
23
|
-
[TimeSpan, (value: TimeSpan) => value?.toString() ?? ''],
|
|
24
|
-
[ValueMap, (value: ValueMap<any, any>) => {
|
|
25
|
-
const converted: any = {};
|
|
26
|
-
for (const [key, mapValue] of value.entries()) {
|
|
27
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return converted;
|
|
31
|
-
}]
|
|
49
|
+
[Boolean, (value: boolean) => value]
|
|
32
50
|
]);
|
|
33
51
|
|
|
34
|
-
const
|
|
52
|
+
const primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
|
|
35
53
|
[Number, (value: any) => value],
|
|
36
54
|
[String, (value: any) => value],
|
|
37
|
-
[Boolean, (value: any) => value]
|
|
38
|
-
[Date, (value: any) => new Date(value)],
|
|
39
|
-
[Guid, (value: any) => Guid.parse(value.toString())],
|
|
40
|
-
[TimeSpan, (value: any) => TimeSpan.parse(value.toString())],
|
|
55
|
+
[Boolean, (value: any) => value]
|
|
41
56
|
]);
|
|
42
57
|
|
|
43
58
|
/**
|
|
@@ -72,11 +87,18 @@ const serializeValueForType = (type: Constructor, value: any) => {
|
|
|
72
87
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
73
88
|
}
|
|
74
89
|
|
|
90
|
+
// Check if there's a registered converter
|
|
75
91
|
if (typeConverters.has(type)) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
92
|
+
const converter = typeConverters.get(type)!;
|
|
93
|
+
return converter.write(value);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Check primitive converters
|
|
97
|
+
if (primitiveConverters.has(type)) {
|
|
98
|
+
return primitiveConverters.get(type)!(value);
|
|
79
99
|
}
|
|
100
|
+
|
|
101
|
+
return convertTypesOnInstance(value);
|
|
80
102
|
};
|
|
81
103
|
|
|
82
104
|
const deserializeValueFromType = (type: Constructor, value: any) => {
|
|
@@ -85,11 +107,18 @@ const deserializeValueFromType = (type: Constructor, value: any) => {
|
|
|
85
107
|
return new type(value);
|
|
86
108
|
}
|
|
87
109
|
|
|
110
|
+
// Check if there's a registered converter
|
|
88
111
|
if (typeSerializers.has(type)) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
const converter = typeSerializers.get(type)!;
|
|
113
|
+
return converter.read(value);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Check primitive serializers
|
|
117
|
+
if (primitiveSerializers.has(type)) {
|
|
118
|
+
return primitiveSerializers.get(type)!(value);
|
|
92
119
|
}
|
|
120
|
+
|
|
121
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
93
122
|
};
|
|
94
123
|
|
|
95
124
|
const deserializeValueFromField = (field: Field, value: any) => {
|
|
@@ -102,18 +131,25 @@ const deserializeValueFromField = (field: Field, value: any) => {
|
|
|
102
131
|
return new field.type(value);
|
|
103
132
|
}
|
|
104
133
|
|
|
134
|
+
// Check if there's a registered converter
|
|
105
135
|
if (typeSerializers.has(field.type)) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
136
|
+
const converter = typeSerializers.get(field.type)!;
|
|
137
|
+
return converter.read(value);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Check primitive serializers
|
|
141
|
+
if (primitiveSerializers.has(field.type)) {
|
|
142
|
+
return primitiveSerializers.get(field.type)!(value);
|
|
116
143
|
}
|
|
144
|
+
|
|
145
|
+
let type = field.type;
|
|
146
|
+
if (value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
147
|
+
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
148
|
+
const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];
|
|
149
|
+
type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
117
153
|
};
|
|
118
154
|
|
|
119
155
|
const serializeMapKey = (key: any): string => {
|
|
@@ -149,12 +185,10 @@ const deserializeMapKey = (keyType: Constructor, key: string): any => {
|
|
|
149
185
|
return key.toLowerCase() === 'true';
|
|
150
186
|
}
|
|
151
187
|
|
|
152
|
-
if
|
|
153
|
-
return new Date(key);
|
|
154
|
-
}
|
|
155
|
-
|
|
188
|
+
// Check if there's a converter for this type
|
|
156
189
|
if (typeSerializers.has(keyType)) {
|
|
157
|
-
|
|
190
|
+
const converter = typeSerializers.get(keyType)!;
|
|
191
|
+
return converter.read(key);
|
|
158
192
|
}
|
|
159
193
|
|
|
160
194
|
return JsonSerializer.deserialize(keyType, key);
|
|
@@ -165,8 +199,10 @@ const deserializeMapValue = (valueType: Constructor | undefined, value: any): an
|
|
|
165
199
|
return value;
|
|
166
200
|
}
|
|
167
201
|
|
|
202
|
+
// Check if there's a converter for this type
|
|
168
203
|
if (typeSerializers.has(valueType)) {
|
|
169
|
-
|
|
204
|
+
const converter = typeSerializers.get(valueType)!;
|
|
205
|
+
return converter.read(value);
|
|
170
206
|
}
|
|
171
207
|
|
|
172
208
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
@@ -191,9 +227,15 @@ const deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, a
|
|
|
191
227
|
};
|
|
192
228
|
|
|
193
229
|
const convertTypesOnInstance = (instance: any) => {
|
|
230
|
+
// Check if there's a converter for this type
|
|
194
231
|
if (typeConverters.has(instance.constructor)) {
|
|
195
232
|
return serializeValueForType(instance.constructor, instance);
|
|
196
233
|
}
|
|
234
|
+
|
|
235
|
+
// Check primitive converters
|
|
236
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
237
|
+
return primitiveConverters.get(instance.constructor)!(instance);
|
|
238
|
+
}
|
|
197
239
|
|
|
198
240
|
const properties = Object.getOwnPropertyNames(instance);
|
|
199
241
|
const converted: any = {};
|
|
@@ -218,6 +260,10 @@ const convertTypesOnInstance = (instance: any) => {
|
|
|
218
260
|
return converted;
|
|
219
261
|
};
|
|
220
262
|
|
|
263
|
+
// Initialize ValueMapJsonConverter with helper functions to avoid circular dependencies
|
|
264
|
+
// Must be done after serializeMapKey and convertTypesOnInstance are defined
|
|
265
|
+
ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
|
|
266
|
+
|
|
221
267
|
/**
|
|
222
268
|
* Represents a serializer for JSON.
|
|
223
269
|
*/
|
package/README.md
CHANGED
|
@@ -21,6 +21,16 @@ You should look at it as a convenience layer on top of the existing base environ
|
|
|
21
21
|
|
|
22
22
|
Read more about how to use it in our documentation.
|
|
23
23
|
|
|
24
|
+
## Support
|
|
25
|
+
|
|
26
|
+
Cratis is an open community, and we are glad to help users, teams evaluating the stack, and contributors.
|
|
27
|
+
|
|
28
|
+
| Channel | Details |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Discord | Join the community on [Discord](https://discord.gg/kt4AMpV8WV) for questions and discussions |
|
|
31
|
+
| GitHub Issues | [Report bugs or request features](https://github.com/Cratis/Fundamentals/issues) |
|
|
32
|
+
| Documentation | Read the docs at [cratis.io](https://cratis.io) |
|
|
33
|
+
|
|
24
34
|
## Contributing
|
|
25
35
|
|
|
26
36
|
If you want to jump into building this repository and possibly contributing, please refer to [contributing](./Documentation/contributing/index.md).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAyQ5C,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
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
import { ConceptAs } from './ConceptAs';
|
|
2
2
|
import { DerivedType } from './DerivedType';
|
|
3
3
|
import { Fields } from './Fields';
|
|
4
|
-
import { Guid } from './Guid';
|
|
5
|
-
import { TimeSpan } from './TimeSpan';
|
|
6
4
|
import { ValueMap } from './ValueMap';
|
|
7
|
-
|
|
5
|
+
import { DateJsonConverter, GuidJsonConverter, TimeSpanJsonConverter, PointJsonConverter, LineStringJsonConverter, PolygonJsonConverter, ValueMapJsonConverter } from './json';
|
|
6
|
+
const converters = [
|
|
7
|
+
new DateJsonConverter(),
|
|
8
|
+
new GuidJsonConverter(),
|
|
9
|
+
new TimeSpanJsonConverter(),
|
|
10
|
+
new PointJsonConverter(),
|
|
11
|
+
new LineStringJsonConverter(),
|
|
12
|
+
new PolygonJsonConverter(),
|
|
13
|
+
new ValueMapJsonConverter()
|
|
14
|
+
];
|
|
15
|
+
const typeConverters = new Map();
|
|
16
|
+
const typeSerializers = new Map();
|
|
17
|
+
for (const converter of converters) {
|
|
18
|
+
typeConverters.set(converter.type, converter);
|
|
19
|
+
typeSerializers.set(converter.type, converter);
|
|
20
|
+
}
|
|
21
|
+
const primitiveConverters = new Map([
|
|
8
22
|
[Number, (value) => value],
|
|
9
23
|
[String, (value) => value],
|
|
10
|
-
[Boolean, (value) => value]
|
|
11
|
-
[Date, (value) => value.toISOString()],
|
|
12
|
-
[Guid, (value) => value?.toString() ?? ''],
|
|
13
|
-
[TimeSpan, (value) => value?.toString() ?? ''],
|
|
14
|
-
[ValueMap, (value) => {
|
|
15
|
-
const converted = {};
|
|
16
|
-
for (const [key, mapValue] of value.entries()) {
|
|
17
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
18
|
-
}
|
|
19
|
-
return converted;
|
|
20
|
-
}]
|
|
24
|
+
[Boolean, (value) => value]
|
|
21
25
|
]);
|
|
22
|
-
const
|
|
26
|
+
const primitiveSerializers = new Map([
|
|
23
27
|
[Number, (value) => value],
|
|
24
28
|
[String, (value) => value],
|
|
25
|
-
[Boolean, (value) => value]
|
|
26
|
-
[Date, (value) => new Date(value)],
|
|
27
|
-
[Guid, (value) => Guid.parse(value.toString())],
|
|
28
|
-
[TimeSpan, (value) => TimeSpan.parse(value.toString())],
|
|
29
|
+
[Boolean, (value) => value]
|
|
29
30
|
]);
|
|
30
31
|
const isConceptAs = (type) => {
|
|
31
32
|
if (!type || !type.prototype)
|
|
@@ -47,22 +48,26 @@ const serializeValueForType = (type, value) => {
|
|
|
47
48
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
48
49
|
}
|
|
49
50
|
if (typeConverters.has(type)) {
|
|
50
|
-
|
|
51
|
+
const converter = typeConverters.get(type);
|
|
52
|
+
return converter.write(value);
|
|
51
53
|
}
|
|
52
|
-
|
|
53
|
-
return
|
|
54
|
+
if (primitiveConverters.has(type)) {
|
|
55
|
+
return primitiveConverters.get(type)(value);
|
|
54
56
|
}
|
|
57
|
+
return convertTypesOnInstance(value);
|
|
55
58
|
};
|
|
56
59
|
const deserializeValueFromType = (type, value) => {
|
|
57
60
|
if (isConceptAs(type)) {
|
|
58
61
|
return new type(value);
|
|
59
62
|
}
|
|
60
63
|
if (typeSerializers.has(type)) {
|
|
61
|
-
|
|
64
|
+
const converter = typeSerializers.get(type);
|
|
65
|
+
return converter.read(value);
|
|
62
66
|
}
|
|
63
|
-
|
|
64
|
-
return
|
|
67
|
+
if (primitiveSerializers.has(type)) {
|
|
68
|
+
return primitiveSerializers.get(type)(value);
|
|
65
69
|
}
|
|
70
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
66
71
|
};
|
|
67
72
|
const deserializeValueFromField = (field, value) => {
|
|
68
73
|
if (field.type === ValueMap) {
|
|
@@ -72,17 +77,19 @@ const deserializeValueFromField = (field, value) => {
|
|
|
72
77
|
return new field.type(value);
|
|
73
78
|
}
|
|
74
79
|
if (typeSerializers.has(field.type)) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
81
|
-
const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];
|
|
82
|
-
type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
83
|
-
}
|
|
84
|
-
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
80
|
+
const converter = typeSerializers.get(field.type);
|
|
81
|
+
return converter.read(value);
|
|
82
|
+
}
|
|
83
|
+
if (primitiveSerializers.has(field.type)) {
|
|
84
|
+
return primitiveSerializers.get(field.type)(value);
|
|
85
85
|
}
|
|
86
|
+
let type = field.type;
|
|
87
|
+
if (value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
88
|
+
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
89
|
+
const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];
|
|
90
|
+
type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
91
|
+
}
|
|
92
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
86
93
|
};
|
|
87
94
|
const serializeMapKey = (key) => {
|
|
88
95
|
if (key === undefined || key === null) {
|
|
@@ -109,11 +116,9 @@ const deserializeMapKey = (keyType, key) => {
|
|
|
109
116
|
if (keyType === Boolean) {
|
|
110
117
|
return key.toLowerCase() === 'true';
|
|
111
118
|
}
|
|
112
|
-
if (keyType === Date) {
|
|
113
|
-
return new Date(key);
|
|
114
|
-
}
|
|
115
119
|
if (typeSerializers.has(keyType)) {
|
|
116
|
-
|
|
120
|
+
const converter = typeSerializers.get(keyType);
|
|
121
|
+
return converter.read(key);
|
|
117
122
|
}
|
|
118
123
|
return JsonSerializer.deserialize(keyType, key);
|
|
119
124
|
};
|
|
@@ -122,7 +127,8 @@ const deserializeMapValue = (valueType, value) => {
|
|
|
122
127
|
return value;
|
|
123
128
|
}
|
|
124
129
|
if (typeSerializers.has(valueType)) {
|
|
125
|
-
|
|
130
|
+
const converter = typeSerializers.get(valueType);
|
|
131
|
+
return converter.read(value);
|
|
126
132
|
}
|
|
127
133
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
128
134
|
};
|
|
@@ -144,6 +150,9 @@ const convertTypesOnInstance = (instance) => {
|
|
|
144
150
|
if (typeConverters.has(instance.constructor)) {
|
|
145
151
|
return serializeValueForType(instance.constructor, instance);
|
|
146
152
|
}
|
|
153
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
154
|
+
return primitiveConverters.get(instance.constructor)(instance);
|
|
155
|
+
}
|
|
147
156
|
const properties = Object.getOwnPropertyNames(instance);
|
|
148
157
|
const converted = {};
|
|
149
158
|
const derivedTypeId = DerivedType.get(instance.constructor);
|
|
@@ -164,6 +173,7 @@ const convertTypesOnInstance = (instance) => {
|
|
|
164
173
|
});
|
|
165
174
|
return converted;
|
|
166
175
|
};
|
|
176
|
+
ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
|
|
167
177
|
export class JsonSerializer {
|
|
168
178
|
static DerivedTypeIdProperty = "_derivedTypeId";
|
|
169
179
|
static serialize(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAyQ5C,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"}
|
|
@@ -3,32 +3,39 @@
|
|
|
3
3
|
var ConceptAs = require('./ConceptAs.js');
|
|
4
4
|
var DerivedType = require('./DerivedType.js');
|
|
5
5
|
var Fields = require('./Fields.js');
|
|
6
|
-
var Guid = require('./Guid.js');
|
|
7
|
-
var TimeSpan = require('./TimeSpan.js');
|
|
8
6
|
var ValueMap = require('./ValueMap.js');
|
|
7
|
+
var DateJsonConverter = require('./json/DateJsonConverter.js');
|
|
8
|
+
var GuidJsonConverter = require('./json/GuidJsonConverter.js');
|
|
9
|
+
var TimeSpanJsonConverter = require('./json/TimeSpanJsonConverter.js');
|
|
10
|
+
var PointJsonConverter = require('./json/PointJsonConverter.js');
|
|
11
|
+
var LineStringJsonConverter = require('./json/LineStringJsonConverter.js');
|
|
12
|
+
var PolygonJsonConverter = require('./json/PolygonJsonConverter.js');
|
|
13
|
+
var ValueMapJsonConverter = require('./json/ValueMapJsonConverter.js');
|
|
9
14
|
|
|
10
|
-
const
|
|
15
|
+
const converters = [
|
|
16
|
+
new DateJsonConverter.DateJsonConverter(),
|
|
17
|
+
new GuidJsonConverter.GuidJsonConverter(),
|
|
18
|
+
new TimeSpanJsonConverter.TimeSpanJsonConverter(),
|
|
19
|
+
new PointJsonConverter.PointJsonConverter(),
|
|
20
|
+
new LineStringJsonConverter.LineStringJsonConverter(),
|
|
21
|
+
new PolygonJsonConverter.PolygonJsonConverter(),
|
|
22
|
+
new ValueMapJsonConverter.ValueMapJsonConverter()
|
|
23
|
+
];
|
|
24
|
+
const typeConverters = new Map();
|
|
25
|
+
const typeSerializers = new Map();
|
|
26
|
+
for (const converter of converters) {
|
|
27
|
+
typeConverters.set(converter.type, converter);
|
|
28
|
+
typeSerializers.set(converter.type, converter);
|
|
29
|
+
}
|
|
30
|
+
const primitiveConverters = new Map([
|
|
11
31
|
[Number, (value) => value],
|
|
12
32
|
[String, (value) => value],
|
|
13
|
-
[Boolean, (value) => value]
|
|
14
|
-
[Date, (value) => value.toISOString()],
|
|
15
|
-
[Guid.Guid, (value) => value?.toString() ?? ''],
|
|
16
|
-
[TimeSpan.TimeSpan, (value) => value?.toString() ?? ''],
|
|
17
|
-
[ValueMap.ValueMap, (value) => {
|
|
18
|
-
const converted = {};
|
|
19
|
-
for (const [key, mapValue] of value.entries()) {
|
|
20
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
21
|
-
}
|
|
22
|
-
return converted;
|
|
23
|
-
}]
|
|
33
|
+
[Boolean, (value) => value]
|
|
24
34
|
]);
|
|
25
|
-
const
|
|
35
|
+
const primitiveSerializers = new Map([
|
|
26
36
|
[Number, (value) => value],
|
|
27
37
|
[String, (value) => value],
|
|
28
|
-
[Boolean, (value) => value]
|
|
29
|
-
[Date, (value) => new Date(value)],
|
|
30
|
-
[Guid.Guid, (value) => Guid.Guid.parse(value.toString())],
|
|
31
|
-
[TimeSpan.TimeSpan, (value) => TimeSpan.TimeSpan.parse(value.toString())],
|
|
38
|
+
[Boolean, (value) => value]
|
|
32
39
|
]);
|
|
33
40
|
const isConceptAs = (type) => {
|
|
34
41
|
if (!type || !type.prototype)
|
|
@@ -50,22 +57,26 @@ const serializeValueForType = (type, value) => {
|
|
|
50
57
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
51
58
|
}
|
|
52
59
|
if (typeConverters.has(type)) {
|
|
53
|
-
|
|
60
|
+
const converter = typeConverters.get(type);
|
|
61
|
+
return converter.write(value);
|
|
54
62
|
}
|
|
55
|
-
|
|
56
|
-
return
|
|
63
|
+
if (primitiveConverters.has(type)) {
|
|
64
|
+
return primitiveConverters.get(type)(value);
|
|
57
65
|
}
|
|
66
|
+
return convertTypesOnInstance(value);
|
|
58
67
|
};
|
|
59
68
|
const deserializeValueFromType = (type, value) => {
|
|
60
69
|
if (isConceptAs(type)) {
|
|
61
70
|
return new type(value);
|
|
62
71
|
}
|
|
63
72
|
if (typeSerializers.has(type)) {
|
|
64
|
-
|
|
73
|
+
const converter = typeSerializers.get(type);
|
|
74
|
+
return converter.read(value);
|
|
65
75
|
}
|
|
66
|
-
|
|
67
|
-
return
|
|
76
|
+
if (primitiveSerializers.has(type)) {
|
|
77
|
+
return primitiveSerializers.get(type)(value);
|
|
68
78
|
}
|
|
79
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
69
80
|
};
|
|
70
81
|
const deserializeValueFromField = (field, value) => {
|
|
71
82
|
if (field.type === ValueMap.ValueMap) {
|
|
@@ -75,17 +86,19 @@ const deserializeValueFromField = (field, value) => {
|
|
|
75
86
|
return new field.type(value);
|
|
76
87
|
}
|
|
77
88
|
if (typeSerializers.has(field.type)) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
84
|
-
const candidates = [...field.derivatives, ...DerivedType.DerivedType.getDerivedTypesFor(field.type)];
|
|
85
|
-
type = candidates.find(_ => DerivedType.DerivedType.get(_) == derivedTypeId) || type;
|
|
86
|
-
}
|
|
87
|
-
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
89
|
+
const converter = typeSerializers.get(field.type);
|
|
90
|
+
return converter.read(value);
|
|
91
|
+
}
|
|
92
|
+
if (primitiveSerializers.has(field.type)) {
|
|
93
|
+
return primitiveSerializers.get(field.type)(value);
|
|
88
94
|
}
|
|
95
|
+
let type = field.type;
|
|
96
|
+
if (value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
97
|
+
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
98
|
+
const candidates = [...field.derivatives, ...DerivedType.DerivedType.getDerivedTypesFor(field.type)];
|
|
99
|
+
type = candidates.find(_ => DerivedType.DerivedType.get(_) == derivedTypeId) || type;
|
|
100
|
+
}
|
|
101
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
89
102
|
};
|
|
90
103
|
const serializeMapKey = (key) => {
|
|
91
104
|
if (key === undefined || key === null) {
|
|
@@ -112,11 +125,9 @@ const deserializeMapKey = (keyType, key) => {
|
|
|
112
125
|
if (keyType === Boolean) {
|
|
113
126
|
return key.toLowerCase() === 'true';
|
|
114
127
|
}
|
|
115
|
-
if (keyType === Date) {
|
|
116
|
-
return new Date(key);
|
|
117
|
-
}
|
|
118
128
|
if (typeSerializers.has(keyType)) {
|
|
119
|
-
|
|
129
|
+
const converter = typeSerializers.get(keyType);
|
|
130
|
+
return converter.read(key);
|
|
120
131
|
}
|
|
121
132
|
return JsonSerializer.deserialize(keyType, key);
|
|
122
133
|
};
|
|
@@ -125,7 +136,8 @@ const deserializeMapValue = (valueType, value) => {
|
|
|
125
136
|
return value;
|
|
126
137
|
}
|
|
127
138
|
if (typeSerializers.has(valueType)) {
|
|
128
|
-
|
|
139
|
+
const converter = typeSerializers.get(valueType);
|
|
140
|
+
return converter.read(value);
|
|
129
141
|
}
|
|
130
142
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
131
143
|
};
|
|
@@ -147,6 +159,9 @@ const convertTypesOnInstance = (instance) => {
|
|
|
147
159
|
if (typeConverters.has(instance.constructor)) {
|
|
148
160
|
return serializeValueForType(instance.constructor, instance);
|
|
149
161
|
}
|
|
162
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
163
|
+
return primitiveConverters.get(instance.constructor)(instance);
|
|
164
|
+
}
|
|
150
165
|
const properties = Object.getOwnPropertyNames(instance);
|
|
151
166
|
const converted = {};
|
|
152
167
|
const derivedTypeId = DerivedType.DerivedType.get(instance.constructor);
|
|
@@ -167,6 +182,7 @@ const convertTypesOnInstance = (instance) => {
|
|
|
167
182
|
});
|
|
168
183
|
return converted;
|
|
169
184
|
};
|
|
185
|
+
ValueMapJsonConverter.ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
|
|
170
186
|
class JsonSerializer {
|
|
171
187
|
static DerivedTypeIdProperty = "_derivedTypeId";
|
|
172
188
|
static serialize(value) {
|