@cratis/fundamentals 7.15.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 -56
- package/dist/JsonSerializer.d.ts.map +1 -1
- package/dist/JsonSerializer.js +50 -54
- package/dist/JsonSerializer.js.map +1 -1
- package/dist/cjs/JsonSerializer.d.ts.map +1 -1
- package/dist/cjs/JsonSerializer.js +56 -54
- 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 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +24 -2
- 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 -54
- 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 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -1
- 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 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- 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 -1
- 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/Coordinate.ts +0 -38
- package/dist/Coordinate.d.ts +0 -7
- package/dist/Coordinate.d.ts.map +0 -1
- package/dist/Coordinate.js +0 -27
- package/dist/Coordinate.js.map +0 -1
- package/dist/cjs/Coordinate.d.ts +0 -7
- package/dist/cjs/Coordinate.d.ts.map +0 -1
- package/dist/cjs/Coordinate.js +0 -32
- package/dist/cjs/Coordinate.js.map +0 -1
- package/dist/esm/Coordinate.d.ts +0 -7
- package/dist/esm/Coordinate.d.ts.map +0 -1
- package/dist/esm/Coordinate.js +0 -30
- package/dist/esm/Coordinate.js.map +0 -1
- package/for_Coordinate/when_creating_coordinate.ts +0 -11
- package/for_Coordinate/when_deserializing_coordinate.ts +0 -14
- package/for_Coordinate/when_deserializing_coordinate_with_missing_properties.ts +0 -13
- package/for_Coordinate/when_serializing_coordinate.ts +0 -14
package/JsonSerializer.ts
CHANGED
|
@@ -3,55 +3,56 @@
|
|
|
3
3
|
|
|
4
4
|
import { ConceptAs } from './ConceptAs';
|
|
5
5
|
import { Constructor } from './Constructor';
|
|
6
|
-
import { Coordinate } from './Coordinate';
|
|
7
6
|
import { DerivedType } from './DerivedType';
|
|
8
7
|
import { Field } from './Field';
|
|
9
8
|
import { Fields } from './Fields';
|
|
10
|
-
import { Guid } from './Guid';
|
|
11
|
-
import { TimeSpan } from './TimeSpan';
|
|
12
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';
|
|
13
20
|
|
|
14
21
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
15
22
|
|
|
16
23
|
type typeSerializer = (value: any) => any;
|
|
17
24
|
|
|
18
|
-
|
|
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>([
|
|
19
47
|
[Number, (value: number) => value],
|
|
20
48
|
[String, (value: string) => value],
|
|
21
|
-
[Boolean, (value: boolean) => value]
|
|
22
|
-
[Date, (value: Date) => value.toISOString()],
|
|
23
|
-
[Guid, (value: Guid) => value?.toString() ?? ''],
|
|
24
|
-
[TimeSpan, (value: TimeSpan) => value?.toString() ?? ''],
|
|
25
|
-
[Coordinate, (value: Coordinate) => value?.toJSON() ?? null],
|
|
26
|
-
[ValueMap, (value: ValueMap<any, any>) => {
|
|
27
|
-
const converted: any = {};
|
|
28
|
-
for (const [key, mapValue] of value.entries()) {
|
|
29
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return converted;
|
|
33
|
-
}]
|
|
49
|
+
[Boolean, (value: boolean) => value]
|
|
34
50
|
]);
|
|
35
51
|
|
|
36
|
-
const
|
|
52
|
+
const primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
|
|
37
53
|
[Number, (value: any) => value],
|
|
38
54
|
[String, (value: any) => value],
|
|
39
|
-
[Boolean, (value: any) => value]
|
|
40
|
-
[Date, (value: any) => new Date(value)],
|
|
41
|
-
[Guid, (value: any) => Guid.parse(value.toString())],
|
|
42
|
-
[TimeSpan, (value: any) => TimeSpan.parse(value.toString())],
|
|
43
|
-
[Coordinate, (value: any) => {
|
|
44
|
-
if (value === null || value === undefined) {
|
|
45
|
-
throw new Error('Cannot deserialize null or undefined to Coordinate');
|
|
46
|
-
}
|
|
47
|
-
if (value.longitude === undefined || value.latitude === undefined) {
|
|
48
|
-
throw new Error('Cannot deserialize Coordinate: longitude and latitude are required');
|
|
49
|
-
}
|
|
50
|
-
const coordinate = new Coordinate();
|
|
51
|
-
coordinate.longitude = value.longitude;
|
|
52
|
-
coordinate.latitude = value.latitude;
|
|
53
|
-
return coordinate;
|
|
54
|
-
}],
|
|
55
|
+
[Boolean, (value: any) => value]
|
|
55
56
|
]);
|
|
56
57
|
|
|
57
58
|
/**
|
|
@@ -86,11 +87,18 @@ const serializeValueForType = (type: Constructor, value: any) => {
|
|
|
86
87
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
87
88
|
}
|
|
88
89
|
|
|
90
|
+
// Check if there's a registered converter
|
|
89
91
|
if (typeConverters.has(type)) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return convertTypesOnInstance(value);
|
|
92
|
+
const converter = typeConverters.get(type)!;
|
|
93
|
+
return converter.write(value);
|
|
93
94
|
}
|
|
95
|
+
|
|
96
|
+
// Check primitive converters
|
|
97
|
+
if (primitiveConverters.has(type)) {
|
|
98
|
+
return primitiveConverters.get(type)!(value);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return convertTypesOnInstance(value);
|
|
94
102
|
};
|
|
95
103
|
|
|
96
104
|
const deserializeValueFromType = (type: Constructor, value: any) => {
|
|
@@ -99,11 +107,18 @@ const deserializeValueFromType = (type: Constructor, value: any) => {
|
|
|
99
107
|
return new type(value);
|
|
100
108
|
}
|
|
101
109
|
|
|
110
|
+
// Check if there's a registered converter
|
|
102
111
|
if (typeSerializers.has(type)) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
112
|
+
const converter = typeSerializers.get(type)!;
|
|
113
|
+
return converter.read(value);
|
|
106
114
|
}
|
|
115
|
+
|
|
116
|
+
// Check primitive serializers
|
|
117
|
+
if (primitiveSerializers.has(type)) {
|
|
118
|
+
return primitiveSerializers.get(type)!(value);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
107
122
|
};
|
|
108
123
|
|
|
109
124
|
const deserializeValueFromField = (field: Field, value: any) => {
|
|
@@ -116,18 +131,25 @@ const deserializeValueFromField = (field: Field, value: any) => {
|
|
|
116
131
|
return new field.type(value);
|
|
117
132
|
}
|
|
118
133
|
|
|
134
|
+
// Check if there's a registered converter
|
|
119
135
|
if (typeSerializers.has(field.type)) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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);
|
|
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;
|
|
130
150
|
}
|
|
151
|
+
|
|
152
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
131
153
|
};
|
|
132
154
|
|
|
133
155
|
const serializeMapKey = (key: any): string => {
|
|
@@ -163,12 +185,10 @@ const deserializeMapKey = (keyType: Constructor, key: string): any => {
|
|
|
163
185
|
return key.toLowerCase() === 'true';
|
|
164
186
|
}
|
|
165
187
|
|
|
166
|
-
if
|
|
167
|
-
return new Date(key);
|
|
168
|
-
}
|
|
169
|
-
|
|
188
|
+
// Check if there's a converter for this type
|
|
170
189
|
if (typeSerializers.has(keyType)) {
|
|
171
|
-
|
|
190
|
+
const converter = typeSerializers.get(keyType)!;
|
|
191
|
+
return converter.read(key);
|
|
172
192
|
}
|
|
173
193
|
|
|
174
194
|
return JsonSerializer.deserialize(keyType, key);
|
|
@@ -179,8 +199,10 @@ const deserializeMapValue = (valueType: Constructor | undefined, value: any): an
|
|
|
179
199
|
return value;
|
|
180
200
|
}
|
|
181
201
|
|
|
202
|
+
// Check if there's a converter for this type
|
|
182
203
|
if (typeSerializers.has(valueType)) {
|
|
183
|
-
|
|
204
|
+
const converter = typeSerializers.get(valueType)!;
|
|
205
|
+
return converter.read(value);
|
|
184
206
|
}
|
|
185
207
|
|
|
186
208
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
@@ -205,9 +227,15 @@ const deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, a
|
|
|
205
227
|
};
|
|
206
228
|
|
|
207
229
|
const convertTypesOnInstance = (instance: any) => {
|
|
230
|
+
// Check if there's a converter for this type
|
|
208
231
|
if (typeConverters.has(instance.constructor)) {
|
|
209
232
|
return serializeValueForType(instance.constructor, instance);
|
|
210
233
|
}
|
|
234
|
+
|
|
235
|
+
// Check primitive converters
|
|
236
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
237
|
+
return primitiveConverters.get(instance.constructor)!(instance);
|
|
238
|
+
}
|
|
211
239
|
|
|
212
240
|
const properties = Object.getOwnPropertyNames(instance);
|
|
213
241
|
const converted: any = {};
|
|
@@ -232,6 +260,10 @@ const convertTypesOnInstance = (instance: any) => {
|
|
|
232
260
|
return converted;
|
|
233
261
|
};
|
|
234
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
|
+
|
|
235
267
|
/**
|
|
236
268
|
* Represents a serializer for JSON.
|
|
237
269
|
*/
|
|
@@ -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,45 +1,32 @@
|
|
|
1
1
|
import { ConceptAs } from './ConceptAs';
|
|
2
|
-
import { Coordinate } from './Coordinate';
|
|
3
2
|
import { DerivedType } from './DerivedType';
|
|
4
3
|
import { Fields } from './Fields';
|
|
5
|
-
import { Guid } from './Guid';
|
|
6
|
-
import { TimeSpan } from './TimeSpan';
|
|
7
4
|
import { ValueMap } from './ValueMap';
|
|
8
|
-
|
|
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([
|
|
9
22
|
[Number, (value) => value],
|
|
10
23
|
[String, (value) => value],
|
|
11
|
-
[Boolean, (value) => value]
|
|
12
|
-
[Date, (value) => value.toISOString()],
|
|
13
|
-
[Guid, (value) => value?.toString() ?? ''],
|
|
14
|
-
[TimeSpan, (value) => value?.toString() ?? ''],
|
|
15
|
-
[Coordinate, (value) => value?.toJSON() ?? null],
|
|
16
|
-
[ValueMap, (value) => {
|
|
17
|
-
const converted = {};
|
|
18
|
-
for (const [key, mapValue] of value.entries()) {
|
|
19
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
20
|
-
}
|
|
21
|
-
return converted;
|
|
22
|
-
}]
|
|
24
|
+
[Boolean, (value) => value]
|
|
23
25
|
]);
|
|
24
|
-
const
|
|
26
|
+
const primitiveSerializers = new Map([
|
|
25
27
|
[Number, (value) => value],
|
|
26
28
|
[String, (value) => value],
|
|
27
|
-
[Boolean, (value) => value]
|
|
28
|
-
[Date, (value) => new Date(value)],
|
|
29
|
-
[Guid, (value) => Guid.parse(value.toString())],
|
|
30
|
-
[TimeSpan, (value) => TimeSpan.parse(value.toString())],
|
|
31
|
-
[Coordinate, (value) => {
|
|
32
|
-
if (value === null || value === undefined) {
|
|
33
|
-
throw new Error('Cannot deserialize null or undefined to Coordinate');
|
|
34
|
-
}
|
|
35
|
-
if (value.longitude === undefined || value.latitude === undefined) {
|
|
36
|
-
throw new Error('Cannot deserialize Coordinate: longitude and latitude are required');
|
|
37
|
-
}
|
|
38
|
-
const coordinate = new Coordinate();
|
|
39
|
-
coordinate.longitude = value.longitude;
|
|
40
|
-
coordinate.latitude = value.latitude;
|
|
41
|
-
return coordinate;
|
|
42
|
-
}],
|
|
29
|
+
[Boolean, (value) => value]
|
|
43
30
|
]);
|
|
44
31
|
const isConceptAs = (type) => {
|
|
45
32
|
if (!type || !type.prototype)
|
|
@@ -61,22 +48,26 @@ const serializeValueForType = (type, value) => {
|
|
|
61
48
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
62
49
|
}
|
|
63
50
|
if (typeConverters.has(type)) {
|
|
64
|
-
|
|
51
|
+
const converter = typeConverters.get(type);
|
|
52
|
+
return converter.write(value);
|
|
65
53
|
}
|
|
66
|
-
|
|
67
|
-
return
|
|
54
|
+
if (primitiveConverters.has(type)) {
|
|
55
|
+
return primitiveConverters.get(type)(value);
|
|
68
56
|
}
|
|
57
|
+
return convertTypesOnInstance(value);
|
|
69
58
|
};
|
|
70
59
|
const deserializeValueFromType = (type, value) => {
|
|
71
60
|
if (isConceptAs(type)) {
|
|
72
61
|
return new type(value);
|
|
73
62
|
}
|
|
74
63
|
if (typeSerializers.has(type)) {
|
|
75
|
-
|
|
64
|
+
const converter = typeSerializers.get(type);
|
|
65
|
+
return converter.read(value);
|
|
76
66
|
}
|
|
77
|
-
|
|
78
|
-
return
|
|
67
|
+
if (primitiveSerializers.has(type)) {
|
|
68
|
+
return primitiveSerializers.get(type)(value);
|
|
79
69
|
}
|
|
70
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
80
71
|
};
|
|
81
72
|
const deserializeValueFromField = (field, value) => {
|
|
82
73
|
if (field.type === ValueMap) {
|
|
@@ -86,17 +77,19 @@ const deserializeValueFromField = (field, value) => {
|
|
|
86
77
|
return new field.type(value);
|
|
87
78
|
}
|
|
88
79
|
if (typeSerializers.has(field.type)) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
else {
|
|
92
|
-
let type = field.type;
|
|
93
|
-
if (value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
94
|
-
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
95
|
-
const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];
|
|
96
|
-
type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
97
|
-
}
|
|
98
|
-
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
80
|
+
const converter = typeSerializers.get(field.type);
|
|
81
|
+
return converter.read(value);
|
|
99
82
|
}
|
|
83
|
+
if (primitiveSerializers.has(field.type)) {
|
|
84
|
+
return primitiveSerializers.get(field.type)(value);
|
|
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));
|
|
100
93
|
};
|
|
101
94
|
const serializeMapKey = (key) => {
|
|
102
95
|
if (key === undefined || key === null) {
|
|
@@ -123,11 +116,9 @@ const deserializeMapKey = (keyType, key) => {
|
|
|
123
116
|
if (keyType === Boolean) {
|
|
124
117
|
return key.toLowerCase() === 'true';
|
|
125
118
|
}
|
|
126
|
-
if (keyType === Date) {
|
|
127
|
-
return new Date(key);
|
|
128
|
-
}
|
|
129
119
|
if (typeSerializers.has(keyType)) {
|
|
130
|
-
|
|
120
|
+
const converter = typeSerializers.get(keyType);
|
|
121
|
+
return converter.read(key);
|
|
131
122
|
}
|
|
132
123
|
return JsonSerializer.deserialize(keyType, key);
|
|
133
124
|
};
|
|
@@ -136,7 +127,8 @@ const deserializeMapValue = (valueType, value) => {
|
|
|
136
127
|
return value;
|
|
137
128
|
}
|
|
138
129
|
if (typeSerializers.has(valueType)) {
|
|
139
|
-
|
|
130
|
+
const converter = typeSerializers.get(valueType);
|
|
131
|
+
return converter.read(value);
|
|
140
132
|
}
|
|
141
133
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
142
134
|
};
|
|
@@ -158,6 +150,9 @@ const convertTypesOnInstance = (instance) => {
|
|
|
158
150
|
if (typeConverters.has(instance.constructor)) {
|
|
159
151
|
return serializeValueForType(instance.constructor, instance);
|
|
160
152
|
}
|
|
153
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
154
|
+
return primitiveConverters.get(instance.constructor)(instance);
|
|
155
|
+
}
|
|
161
156
|
const properties = Object.getOwnPropertyNames(instance);
|
|
162
157
|
const converted = {};
|
|
163
158
|
const derivedTypeId = DerivedType.get(instance.constructor);
|
|
@@ -178,6 +173,7 @@ const convertTypesOnInstance = (instance) => {
|
|
|
178
173
|
});
|
|
179
174
|
return converted;
|
|
180
175
|
};
|
|
176
|
+
ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
|
|
181
177
|
export class JsonSerializer {
|
|
182
178
|
static DerivedTypeIdProperty = "_derivedTypeId";
|
|
183
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,
|
|
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"}
|
|
@@ -1,48 +1,41 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var ConceptAs = require('./ConceptAs.js');
|
|
4
|
-
var Coordinate = require('./Coordinate.js');
|
|
5
4
|
var DerivedType = require('./DerivedType.js');
|
|
6
5
|
var Fields = require('./Fields.js');
|
|
7
|
-
var Guid = require('./Guid.js');
|
|
8
|
-
var TimeSpan = require('./TimeSpan.js');
|
|
9
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');
|
|
10
14
|
|
|
11
|
-
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([
|
|
12
31
|
[Number, (value) => value],
|
|
13
32
|
[String, (value) => value],
|
|
14
|
-
[Boolean, (value) => value]
|
|
15
|
-
[Date, (value) => value.toISOString()],
|
|
16
|
-
[Guid.Guid, (value) => value?.toString() ?? ''],
|
|
17
|
-
[TimeSpan.TimeSpan, (value) => value?.toString() ?? ''],
|
|
18
|
-
[Coordinate.Coordinate, (value) => value?.toJSON() ?? null],
|
|
19
|
-
[ValueMap.ValueMap, (value) => {
|
|
20
|
-
const converted = {};
|
|
21
|
-
for (const [key, mapValue] of value.entries()) {
|
|
22
|
-
converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
|
|
23
|
-
}
|
|
24
|
-
return converted;
|
|
25
|
-
}]
|
|
33
|
+
[Boolean, (value) => value]
|
|
26
34
|
]);
|
|
27
|
-
const
|
|
35
|
+
const primitiveSerializers = new Map([
|
|
28
36
|
[Number, (value) => value],
|
|
29
37
|
[String, (value) => value],
|
|
30
|
-
[Boolean, (value) => value]
|
|
31
|
-
[Date, (value) => new Date(value)],
|
|
32
|
-
[Guid.Guid, (value) => Guid.Guid.parse(value.toString())],
|
|
33
|
-
[TimeSpan.TimeSpan, (value) => TimeSpan.TimeSpan.parse(value.toString())],
|
|
34
|
-
[Coordinate.Coordinate, (value) => {
|
|
35
|
-
if (value === null || value === undefined) {
|
|
36
|
-
throw new Error('Cannot deserialize null or undefined to Coordinate');
|
|
37
|
-
}
|
|
38
|
-
if (value.longitude === undefined || value.latitude === undefined) {
|
|
39
|
-
throw new Error('Cannot deserialize Coordinate: longitude and latitude are required');
|
|
40
|
-
}
|
|
41
|
-
const coordinate = new Coordinate.Coordinate();
|
|
42
|
-
coordinate.longitude = value.longitude;
|
|
43
|
-
coordinate.latitude = value.latitude;
|
|
44
|
-
return coordinate;
|
|
45
|
-
}],
|
|
38
|
+
[Boolean, (value) => value]
|
|
46
39
|
]);
|
|
47
40
|
const isConceptAs = (type) => {
|
|
48
41
|
if (!type || !type.prototype)
|
|
@@ -64,22 +57,26 @@ const serializeValueForType = (type, value) => {
|
|
|
64
57
|
return serializeValueForType(innerValue.constructor, innerValue);
|
|
65
58
|
}
|
|
66
59
|
if (typeConverters.has(type)) {
|
|
67
|
-
|
|
60
|
+
const converter = typeConverters.get(type);
|
|
61
|
+
return converter.write(value);
|
|
68
62
|
}
|
|
69
|
-
|
|
70
|
-
return
|
|
63
|
+
if (primitiveConverters.has(type)) {
|
|
64
|
+
return primitiveConverters.get(type)(value);
|
|
71
65
|
}
|
|
66
|
+
return convertTypesOnInstance(value);
|
|
72
67
|
};
|
|
73
68
|
const deserializeValueFromType = (type, value) => {
|
|
74
69
|
if (isConceptAs(type)) {
|
|
75
70
|
return new type(value);
|
|
76
71
|
}
|
|
77
72
|
if (typeSerializers.has(type)) {
|
|
78
|
-
|
|
73
|
+
const converter = typeSerializers.get(type);
|
|
74
|
+
return converter.read(value);
|
|
79
75
|
}
|
|
80
|
-
|
|
81
|
-
return
|
|
76
|
+
if (primitiveSerializers.has(type)) {
|
|
77
|
+
return primitiveSerializers.get(type)(value);
|
|
82
78
|
}
|
|
79
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
83
80
|
};
|
|
84
81
|
const deserializeValueFromField = (field, value) => {
|
|
85
82
|
if (field.type === ValueMap.ValueMap) {
|
|
@@ -89,17 +86,19 @@ const deserializeValueFromField = (field, value) => {
|
|
|
89
86
|
return new field.type(value);
|
|
90
87
|
}
|
|
91
88
|
if (typeSerializers.has(field.type)) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
else {
|
|
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
|
+
const converter = typeSerializers.get(field.type);
|
|
90
|
+
return converter.read(value);
|
|
102
91
|
}
|
|
92
|
+
if (primitiveSerializers.has(field.type)) {
|
|
93
|
+
return primitiveSerializers.get(field.type)(value);
|
|
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));
|
|
103
102
|
};
|
|
104
103
|
const serializeMapKey = (key) => {
|
|
105
104
|
if (key === undefined || key === null) {
|
|
@@ -126,11 +125,9 @@ const deserializeMapKey = (keyType, key) => {
|
|
|
126
125
|
if (keyType === Boolean) {
|
|
127
126
|
return key.toLowerCase() === 'true';
|
|
128
127
|
}
|
|
129
|
-
if (keyType === Date) {
|
|
130
|
-
return new Date(key);
|
|
131
|
-
}
|
|
132
128
|
if (typeSerializers.has(keyType)) {
|
|
133
|
-
|
|
129
|
+
const converter = typeSerializers.get(keyType);
|
|
130
|
+
return converter.read(key);
|
|
134
131
|
}
|
|
135
132
|
return JsonSerializer.deserialize(keyType, key);
|
|
136
133
|
};
|
|
@@ -139,7 +136,8 @@ const deserializeMapValue = (valueType, value) => {
|
|
|
139
136
|
return value;
|
|
140
137
|
}
|
|
141
138
|
if (typeSerializers.has(valueType)) {
|
|
142
|
-
|
|
139
|
+
const converter = typeSerializers.get(valueType);
|
|
140
|
+
return converter.read(value);
|
|
143
141
|
}
|
|
144
142
|
return JsonSerializer.deserialize(valueType, JSON.stringify(value));
|
|
145
143
|
};
|
|
@@ -161,6 +159,9 @@ const convertTypesOnInstance = (instance) => {
|
|
|
161
159
|
if (typeConverters.has(instance.constructor)) {
|
|
162
160
|
return serializeValueForType(instance.constructor, instance);
|
|
163
161
|
}
|
|
162
|
+
if (primitiveConverters.has(instance.constructor)) {
|
|
163
|
+
return primitiveConverters.get(instance.constructor)(instance);
|
|
164
|
+
}
|
|
164
165
|
const properties = Object.getOwnPropertyNames(instance);
|
|
165
166
|
const converted = {};
|
|
166
167
|
const derivedTypeId = DerivedType.DerivedType.get(instance.constructor);
|
|
@@ -181,6 +182,7 @@ const convertTypesOnInstance = (instance) => {
|
|
|
181
182
|
});
|
|
182
183
|
return converted;
|
|
183
184
|
};
|
|
185
|
+
ValueMapJsonConverter.ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
|
|
184
186
|
class JsonSerializer {
|
|
185
187
|
static DerivedTypeIdProperty = "_derivedTypeId";
|
|
186
188
|
static serialize(value) {
|