@cratis/fundamentals 4.3.0 → 5.0.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/DerivedType.ts +14 -0
- package/Field.ts +12 -0
- package/Fields.ts +32 -0
- package/JsonSerializer.ts +110 -0
- package/README.md +63 -6
- package/d.yarnist/cjs/Constructor.d.ts +2 -0
- package/d.yarnist/cjs/DerivedType.d.ts +6 -0
- package/d.yarnist/cjs/Field.d.ts +9 -0
- package/d.yarnist/cjs/Fields.d.ts +8 -0
- package/d.yarnist/cjs/JsonSerializer.d.ts +9 -0
- package/d.yarnist/cjs/PropertyAccessor.d.ts +2 -0
- package/d.yarnist/cjs/derivedTypeDecorator.d.ts +3 -0
- package/d.yarnist/cjs/fieldDecorator.d.ts +3 -0
- package/d.yarnist/cjs/index.d.ts +13 -0
- package/d.yarnist/cjs/index.js +24 -0
- package/derivedTypeDecorator.ts +11 -0
- package/dist/esm/Constructor.d.ts +2 -0
- package/dist/esm/Constructor.d.ts.map +1 -0
- package/dist/esm/DerivedType.d.ts +6 -0
- package/dist/esm/DerivedType.d.ts.map +1 -0
- package/dist/esm/DerivedType.js +11 -0
- package/dist/esm/DerivedType.js.map +1 -0
- package/dist/esm/Field.d.ts +9 -0
- package/dist/esm/Field.d.ts.map +1 -0
- package/dist/esm/Field.js +11 -0
- package/dist/esm/Field.js.map +1 -0
- package/dist/esm/Fields.d.ts +8 -0
- package/dist/esm/Fields.d.ts.map +1 -0
- package/dist/esm/Fields.js +26 -0
- package/dist/esm/Fields.js.map +1 -0
- package/dist/esm/Guid.d.ts +13 -0
- package/dist/esm/Guid.d.ts.map +1 -0
- package/dist/{Guid.js → esm/Guid.js} +3 -5
- package/dist/esm/Guid.js.map +1 -0
- package/dist/esm/IEquatable.d.ts +4 -0
- package/dist/esm/IEquatable.d.ts.map +1 -0
- package/dist/esm/JsonSerializer.d.ts +9 -0
- package/dist/esm/JsonSerializer.d.ts.map +1 -0
- package/dist/esm/JsonSerializer.js +68 -0
- package/dist/esm/JsonSerializer.js.map +1 -0
- package/dist/esm/PropertyAccessor.d.ts +2 -0
- package/dist/esm/PropertyAccessor.d.ts.map +1 -0
- package/dist/esm/PropertyAccessorDescriptor.d.ts +10 -0
- package/dist/esm/PropertyAccessorDescriptor.d.ts.map +1 -0
- package/dist/{PropertyAccessorDescriptor.js → esm/PropertyAccessorDescriptor.js} +3 -5
- package/dist/esm/PropertyAccessorDescriptor.js.map +1 -0
- package/dist/esm/PropertyPathResolverProxyHandler.d.ts +12 -0
- package/dist/esm/PropertyPathResolverProxyHandler.d.ts.map +1 -0
- package/dist/{PropertyPathResolverProxyHandler.js → esm/PropertyPathResolverProxyHandler.js} +3 -5
- package/dist/esm/PropertyPathResolverProxyHandler.js.map +1 -0
- package/dist/esm/derivedTypeDecorator.d.ts +3 -0
- package/dist/esm/derivedTypeDecorator.d.ts.map +1 -0
- package/dist/esm/derivedTypeDecorator.js +11 -0
- package/dist/esm/derivedTypeDecorator.js.map +1 -0
- package/dist/esm/fieldDecorator.d.ts +3 -0
- package/dist/esm/fieldDecorator.d.ts.map +1 -0
- package/dist/esm/fieldDecorator.js +10 -0
- package/dist/esm/fieldDecorator.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/fieldDecorator.ts +11 -0
- package/for_Fields/when_adding_fiields_to_type.ts +42 -0
- package/for_JsonSerializer/when_deserializing_complex_nested_object_with_multiple_wellknown_types.ts +116 -0
- package/for_JsonSerializer/when_deserializing_json_array.ts +44 -0
- package/for_JsonSerializer/when_deserializing_object_with_any_object_on_it.ts +30 -0
- package/index.ts +6 -0
- package/package.json +25 -15
- package/dist/Constructor.d.ts +0 -2
- package/dist/Constructor.d.ts.map +0 -1
- package/dist/Constructor.js +0 -3
- package/dist/Constructor.js.map +0 -1
- package/dist/Guid.d.ts.map +0 -1
- package/dist/Guid.js.map +0 -1
- package/dist/IEquatable.d.ts.map +0 -1
- package/dist/IEquatable.js +0 -3
- package/dist/IEquatable.js.map +0 -1
- package/dist/PropertyAccessor.d.ts +0 -2
- package/dist/PropertyAccessor.d.ts.map +0 -1
- package/dist/PropertyAccessor.js +0 -3
- package/dist/PropertyAccessor.js.map +0 -1
- package/dist/PropertyAccessorDescriptor.d.ts.map +0 -1
- package/dist/PropertyAccessorDescriptor.js.map +0 -1
- package/dist/PropertyPathResolverProxyHandler.d.ts.map +0 -1
- package/dist/PropertyPathResolverProxyHandler.js.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.d.ts +0 -2
- package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.d.ts.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.js +0 -9
- package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.js.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_different_guids.d.ts +0 -2
- package/dist/for_Guid/when_checking_equality/of_two_different_guids.d.ts.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_different_guids.js +0 -9
- package/dist/for_Guid/when_checking_equality/of_two_different_guids.js.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.d.ts +0 -2
- package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.d.ts.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.js +0 -9
- package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.js.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids.d.ts +0 -2
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids.d.ts.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids.js +0 -9
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids.js.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.d.ts +0 -2
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.d.ts.map +0 -1
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.js +0 -9
- package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.js.map +0 -1
- package/dist/for_Guid/when_constructing_using_uint8array.d.ts +0 -2
- package/dist/for_Guid/when_constructing_using_uint8array.d.ts.map +0 -1
- package/dist/for_Guid/when_constructing_using_uint8array.js +0 -10
- package/dist/for_Guid/when_constructing_using_uint8array.js.map +0 -1
- package/dist/for_Guid/when_converting_to_string.d.ts +0 -2
- package/dist/for_Guid/when_converting_to_string.d.ts.map +0 -1
- package/dist/for_Guid/when_converting_to_string.js +0 -11
- package/dist/for_Guid/when_converting_to_string.js.map +0 -1
- package/dist/for_Guid/when_creating.d.ts +0 -2
- package/dist/for_Guid/when_creating.d.ts.map +0 -1
- package/dist/for_Guid/when_creating.js +0 -8
- package/dist/for_Guid/when_creating.js.map +0 -1
- package/dist/for_Guid/when_getting_as/and_input_is_specific_type.d.ts +0 -2
- package/dist/for_Guid/when_getting_as/and_input_is_specific_type.d.ts.map +0 -1
- package/dist/for_Guid/when_getting_as/and_input_is_specific_type.js +0 -12
- package/dist/for_Guid/when_getting_as/and_input_is_specific_type.js.map +0 -1
- package/dist/for_Guid/when_getting_as/and_input_is_string.d.ts +0 -2
- package/dist/for_Guid/when_getting_as/and_input_is_string.d.ts.map +0 -1
- package/dist/for_Guid/when_getting_as/and_input_is_string.js +0 -11
- package/dist/for_Guid/when_getting_as/and_input_is_string.js.map +0 -1
- package/dist/for_Guid/when_getting_empty.d.ts +0 -2
- package/dist/for_Guid/when_getting_empty.d.ts.map +0 -1
- package/dist/for_Guid/when_getting_empty.js +0 -11
- package/dist/for_Guid/when_getting_empty.js.map +0 -1
- package/dist/for_Guid/when_parsing.d.ts +0 -2
- package/dist/for_Guid/when_parsing.d.ts.map +0 -1
- package/dist/for_Guid/when_parsing.js +0 -10
- package/dist/for_Guid/when_parsing.js.map +0 -1
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.d.ts +0 -2
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.d.ts.map +0 -1
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.js +0 -19
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.js.map +0 -1
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.d.ts +0 -2
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.d.ts.map +0 -1
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.js +0 -31
- package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -10
- package/dist/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/{dist → d.yarnist/cjs}/Guid.d.ts +0 -0
- /package/{dist → d.yarnist/cjs}/IEquatable.d.ts +0 -0
- /package/{dist → d.yarnist/cjs}/PropertyAccessorDescriptor.d.ts +0 -0
- /package/{dist → d.yarnist/cjs}/PropertyPathResolverProxyHandler.d.ts +0 -0
package/DerivedType.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
import { Constructor } from './Constructor';
|
|
5
|
+
|
|
6
|
+
export class DerivedType {
|
|
7
|
+
static set(target: Constructor, identifier: string) {
|
|
8
|
+
Reflect.defineMetadata('derivedType', identifier, target);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static get(target: Constructor): string {
|
|
12
|
+
return Reflect.getOwnMetadata('derivedType', target);
|
|
13
|
+
}
|
|
14
|
+
}
|
package/Field.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
import { Constructor } from './Constructor';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents a field on a type.
|
|
8
|
+
*/
|
|
9
|
+
export class Field {
|
|
10
|
+
constructor(readonly name: string, readonly type: Constructor, readonly enumerable: boolean, readonly derivatives: Constructor[]) {
|
|
11
|
+
}
|
|
12
|
+
}
|
package/Fields.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
import 'reflect-metadata';
|
|
5
|
+
import { Constructor } from './Constructor';
|
|
6
|
+
import { Field } from './Field';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Represents a system working with fields on types.
|
|
10
|
+
*/
|
|
11
|
+
export class Fields {
|
|
12
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]) {
|
|
13
|
+
let fields: Map<string, Field> = new Map<string, Field>();
|
|
14
|
+
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
15
|
+
fields = Reflect.getOwnMetadata('fields', target);
|
|
16
|
+
}
|
|
17
|
+
fields.set(field, new Field(field, fieldType, enumerable, derivatives));
|
|
18
|
+
Reflect.defineMetadata('fields', fields, target);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static getFieldsForType(target: Constructor): Field[] {
|
|
22
|
+
const fields: Field[] = [];
|
|
23
|
+
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
24
|
+
const fieldsMap = Reflect.getOwnMetadata('fields', target) as Map<string, Field>;
|
|
25
|
+
for (const field of fieldsMap.entries()) {
|
|
26
|
+
fields.push(field[1]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return fields;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
import { Constructor } from './Constructor';
|
|
5
|
+
import { Field } from './Field';
|
|
6
|
+
import { Fields } from './Fields';
|
|
7
|
+
import { DerivedType } from './DerivedType';
|
|
8
|
+
|
|
9
|
+
type typeSerializer = (value: any) => any;
|
|
10
|
+
|
|
11
|
+
const typeSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
|
|
12
|
+
[Number, (value: any) => value],
|
|
13
|
+
[String, (value: any) => value],
|
|
14
|
+
[Boolean, (value: any) => value],
|
|
15
|
+
[Date, (value: any) => new Date(value)]
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
const deserializeValue = (field: Field, value: any) => {
|
|
19
|
+
if (typeSerializers.has(field.type)) {
|
|
20
|
+
return typeSerializers.get(field.type)!(value);
|
|
21
|
+
} else {
|
|
22
|
+
let type = field.type;
|
|
23
|
+
if (field.derivatives.length > 0 && value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
24
|
+
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
25
|
+
type = field.derivatives.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Represents a serializer for JSON.
|
|
34
|
+
*/
|
|
35
|
+
export class JsonSerializer {
|
|
36
|
+
static readonly DerivedTypeIdProperty: string = "_derivedTypeId";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Deserialize a JSON string to the specific type.
|
|
40
|
+
* @param {Constructor} targetType Type to deserialize to.
|
|
41
|
+
* @param {string} json Actual JSON to deserialize.
|
|
42
|
+
* @returns An instance of the target type.
|
|
43
|
+
*/
|
|
44
|
+
static deserialize<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult {
|
|
45
|
+
const parsed = JSON.parse(json);
|
|
46
|
+
return this.deserializeFromInstance<TResult>(targetType, parsed);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Deserialize a array JSON string to an array of the specific instance type.
|
|
51
|
+
* @param {Constructor} targetType Type to deserialize to.
|
|
52
|
+
* @param {string} json Actual JSON to deserialize.
|
|
53
|
+
* @returns An array of instances of the target type.
|
|
54
|
+
*/
|
|
55
|
+
static deserializeArray<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult[] {
|
|
56
|
+
const parsed = JSON.parse(json);
|
|
57
|
+
return this.deserializeArrayFromInstance(targetType, parsed);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Deserialize an any instance to a specific instance type.
|
|
62
|
+
* @param {Constructor} targetType Type to deserialize to.
|
|
63
|
+
* @param {*} instance Actual instance to deserialize.
|
|
64
|
+
* @returns An instance of the target type.
|
|
65
|
+
*/
|
|
66
|
+
static deserializeFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instance: any): TResult {
|
|
67
|
+
const fields = Fields.getFieldsForType(targetType as Constructor);
|
|
68
|
+
const deserialized = new targetType();
|
|
69
|
+
for (const field of fields) {
|
|
70
|
+
let value = instance[field.name];
|
|
71
|
+
if (value) {
|
|
72
|
+
if (field.enumerable) {
|
|
73
|
+
value = value.map(_ => deserializeValue(field, _));
|
|
74
|
+
} else {
|
|
75
|
+
value = deserializeValue(field, value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
deserialized[field.name] = value;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if ((targetType as Constructor) == Object) {
|
|
83
|
+
const objectFields = Object.keys(instance).filter((value, index, arr) => {
|
|
84
|
+
return !fields.some(_ => _.name == value);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
for (const field of objectFields) {
|
|
88
|
+
deserialized[field] = instance[field];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return deserialized;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Deserialize an array of any instances to an array of specific instance types.
|
|
97
|
+
* @param {Constructor} targetType Type to deserialize to.
|
|
98
|
+
* @param {instances} instances Actual instances to deserialize.
|
|
99
|
+
* @returns An array of instances of the target type.
|
|
100
|
+
*/
|
|
101
|
+
static deserializeArrayFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instances: any): TResult[] {
|
|
102
|
+
const deserialized: TResult[] = [];
|
|
103
|
+
|
|
104
|
+
for (const instance of instances) {
|
|
105
|
+
deserialized.push(this.deserializeFromInstance<TResult>(targetType, instance));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return deserialized;
|
|
109
|
+
}
|
|
110
|
+
}
|
package/README.md
CHANGED
|
@@ -1,10 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Fundamentals
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://github.com/Cratis/cratis/actions/workflows/node-build.yml)
|
|
5
|
-
[](http://nuget.org/packages/cratis)
|
|
3
|
+
## Packages / Deployables
|
|
6
4
|
|
|
5
|
+
[](http://nuget.org/packages/cratis.fundamentals)
|
|
6
|
+
[](https://www.npmjs.com/package/@cratis/fundamentals)
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Builds
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
[](https://github.com/cratis/Fundamentals/actions/workflows/dotnet-build.yml)
|
|
11
|
+
[](https://github.com/cratis/Fundamentals/actions/workflows/javascript-build.yml)
|
|
12
|
+
|
|
13
|
+
## Description
|
|
14
|
+
|
|
15
|
+
The Cratis fundamentals holds generic reusable helpers, utilities and tools that aims at solving common problems and help developers be more productive.
|
|
16
|
+
Fundamentals offers functionality for .NET and JavaScript environments. It is not a goal to have parity, as the different environments offer different
|
|
17
|
+
building blocks.
|
|
18
|
+
|
|
19
|
+
You should look at it as a convenience layer on top of the existing base environment you're running in.
|
|
20
|
+
|
|
21
|
+
Read more about how to use it in our documentation.
|
|
22
|
+
|
|
23
|
+
## Contributing
|
|
24
|
+
|
|
25
|
+
If you want to jump into building this repository and possibly contributing, please refer to [contributing](./Documentation/contributing/index.md).
|
|
26
|
+
|
|
27
|
+
### Prerequisites
|
|
28
|
+
|
|
29
|
+
The following are prerequisites to work with this repository.
|
|
30
|
+
|
|
31
|
+
* [.NET 6+](https://dotnet.microsoft.com/en-us/).
|
|
32
|
+
* [Node 16+](https://nodejs.org/en)
|
|
33
|
+
* [Yarn](https://yarnpkg.com)
|
|
34
|
+
|
|
35
|
+
### Central Package Management
|
|
36
|
+
|
|
37
|
+
This repository leverages [Central Package Management](https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management), which
|
|
38
|
+
means that all package versions are managed from a file at the root level called [Directory.Packages.props](./Directory.Packages.props).
|
|
39
|
+
|
|
40
|
+
In addition there are also [Directory.Build.props](https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022#directorybuildprops-and-directorybuildtargets) files for
|
|
41
|
+
setting up common settings that are applied cross cuttingly.
|
|
42
|
+
|
|
43
|
+
### Root package.json
|
|
44
|
+
|
|
45
|
+
The `package.json` found at the root level defines all the workspaces. It is assumed
|
|
46
|
+
|
|
47
|
+
All developer dependencies are defined in the top level `package.json`. The reason for this is to be able to provide global scripts
|
|
48
|
+
for every package to use for easier maintenance.
|
|
49
|
+
|
|
50
|
+
The `package.json` found at the top level contains scripts that can then be used in a child project for this to work properly.
|
|
51
|
+
|
|
52
|
+
In a package, all you need to do is to define the scripts to use the global scripts in the `package.json´ of that project:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"scripts": {
|
|
57
|
+
"prepublish": "yarn g:build",
|
|
58
|
+
"clean": "yarn g:clean",
|
|
59
|
+
"build": "yarn g:build",
|
|
60
|
+
"lint": "yarn g:lint",
|
|
61
|
+
"lint:ci": "yarn g:lint:ci",
|
|
62
|
+
"test": "yarn g:test",
|
|
63
|
+
"ci": "yarn g:ci",
|
|
64
|
+
"up": "yarn g:up"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Constructor } from './Constructor';
|
|
2
|
+
export declare class Field {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly type: Constructor;
|
|
5
|
+
readonly enumerable: boolean;
|
|
6
|
+
readonly derivatives: Constructor[];
|
|
7
|
+
constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[]);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=Field.d.ts.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Constructor } from './Constructor';
|
|
3
|
+
import { Field } from './Field';
|
|
4
|
+
export declare class Fields {
|
|
5
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
|
|
6
|
+
static getFieldsForType(target: Constructor): Field[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Fields.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Constructor } from './Constructor';
|
|
2
|
+
export declare class JsonSerializer {
|
|
3
|
+
static readonly DerivedTypeIdProperty: string;
|
|
4
|
+
static deserialize<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult;
|
|
5
|
+
static deserializeArray<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult[];
|
|
6
|
+
static deserializeFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instance: any): TResult;
|
|
7
|
+
static deserializeArrayFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instances: any): TResult[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=JsonSerializer.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './Constructor';
|
|
2
|
+
export * from './Field';
|
|
3
|
+
export * from './Fields';
|
|
4
|
+
export * from './Guid';
|
|
5
|
+
export * from './IEquatable';
|
|
6
|
+
export * from './PropertyAccessor';
|
|
7
|
+
export * from './PropertyAccessorDescriptor';
|
|
8
|
+
export * from './PropertyPathResolverProxyHandler';
|
|
9
|
+
export * from './fieldDecorator';
|
|
10
|
+
export * from './derivedTypeDecorator';
|
|
11
|
+
export * from './JsonSerializer';
|
|
12
|
+
export * from './DerivedType';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Field = require('./Field.js');
|
|
4
|
+
var Fields = require('./Fields.js');
|
|
5
|
+
var Guid = require('./Guid.js');
|
|
6
|
+
var PropertyAccessorDescriptor = require('./PropertyAccessorDescriptor.js');
|
|
7
|
+
var PropertyPathResolverProxyHandler = require('./PropertyPathResolverProxyHandler.js');
|
|
8
|
+
var fieldDecorator = require('./fieldDecorator.js');
|
|
9
|
+
var derivedTypeDecorator = require('./derivedTypeDecorator.js');
|
|
10
|
+
var JsonSerializer = require('./JsonSerializer.js');
|
|
11
|
+
var DerivedType = require('./DerivedType.js');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
exports.Field = Field.Field;
|
|
16
|
+
exports.Fields = Fields.Fields;
|
|
17
|
+
exports.Guid = Guid.Guid;
|
|
18
|
+
exports.PropertyAccessorDescriptor = PropertyAccessorDescriptor.PropertyAccessorDescriptor;
|
|
19
|
+
exports.PropertyPathResolverProxyHandler = PropertyPathResolverProxyHandler.PropertyPathResolverProxyHandler;
|
|
20
|
+
exports.field = fieldDecorator.field;
|
|
21
|
+
exports.derivedType = derivedTypeDecorator.derivedType;
|
|
22
|
+
exports.JsonSerializer = JsonSerializer.JsonSerializer;
|
|
23
|
+
exports.DerivedType = DerivedType.DerivedType;
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
import 'reflect-metadata';
|
|
5
|
+
import { DerivedType } from './DerivedType';
|
|
6
|
+
|
|
7
|
+
export function derivedType(identifier: string) {
|
|
8
|
+
return function (target: any) {
|
|
9
|
+
DerivedType.set(target, identifier);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constructor.d.ts","sourceRoot":"","sources":["../../Constructor.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DerivedType.d.ts","sourceRoot":"","sources":["../../DerivedType.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qBAAa,WAAW;IACpB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAIlD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;CAG1C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class DerivedType {
|
|
2
|
+
static set(target, identifier) {
|
|
3
|
+
Reflect.defineMetadata('derivedType', identifier, target);
|
|
4
|
+
}
|
|
5
|
+
static get(target) {
|
|
6
|
+
return Reflect.getOwnMetadata('derivedType', target);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { DerivedType };
|
|
11
|
+
//# sourceMappingURL=DerivedType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DerivedType.js","sources":["../../DerivedType.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\nexport class DerivedType {\n static set(target: Constructor, identifier: string) {\n Reflect.defineMetadata('derivedType', identifier, target);\n }\n\n static get(target: Constructor): string {\n return Reflect.getOwnMetadata('derivedType', target);\n }\n}\n"],"names":[],"mappings":"MAKa,WAAW,CAAA;AACpB,IAAA,OAAO,GAAG,CAAC,MAAmB,EAAE,UAAkB,EAAA;QAC9C,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;KAC7D;IAED,OAAO,GAAG,CAAC,MAAmB,EAAA;QAC1B,OAAO,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;KACxD;AACJ;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Constructor } from './Constructor';
|
|
2
|
+
export declare class Field {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly type: Constructor;
|
|
5
|
+
readonly enumerable: boolean;
|
|
6
|
+
readonly derivatives: Constructor[];
|
|
7
|
+
constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[]);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=Field.d.ts.map
|
|
@@ -0,0 +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;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;gBAA3G,IAAI,EAAE,MAAM,EAAW,IAAI,EAAE,WAAW,EAAW,UAAU,EAAE,OAAO,EAAW,WAAW,EAAE,WAAW,EAAE;CAEnI"}
|
|
@@ -0,0 +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, readonly type: Constructor, readonly enumerable: boolean, readonly derivatives: Constructor[]) {\n }\n}\n"],"names":[],"mappings":"MAQc,KAAK,CAAA;AACf,IAAA,WAAA,CAAqB,IAAY,EAAW,IAAiB,EAAW,UAAmB,EAAW,WAA0B,EAAA;QAA3G,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QAAW,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAa;QAAW,IAAU,CAAA,UAAA,GAAV,UAAU,CAAS;QAAW,IAAW,CAAA,WAAA,GAAX,WAAW,CAAe;KAC/H;AACJ;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Constructor } from './Constructor';
|
|
3
|
+
import { Field } from './Field';
|
|
4
|
+
export declare class Fields {
|
|
5
|
+
static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
|
|
6
|
+
static getFieldsForType(target: Constructor): Field[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Fields.d.ts.map
|
|
@@ -0,0 +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;IASjI,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Field } from './Field.js';
|
|
3
|
+
|
|
4
|
+
class Fields {
|
|
5
|
+
static addFieldToType(target, field, fieldType, enumerable, derivatives) {
|
|
6
|
+
let fields = new Map();
|
|
7
|
+
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
8
|
+
fields = Reflect.getOwnMetadata('fields', target);
|
|
9
|
+
}
|
|
10
|
+
fields.set(field, new Field(field, fieldType, enumerable, derivatives));
|
|
11
|
+
Reflect.defineMetadata('fields', fields, target);
|
|
12
|
+
}
|
|
13
|
+
static getFieldsForType(target) {
|
|
14
|
+
const fields = [];
|
|
15
|
+
if (Reflect.hasOwnMetadata('fields', target)) {
|
|
16
|
+
const fieldsMap = Reflect.getOwnMetadata('fields', target);
|
|
17
|
+
for (const field of fieldsMap.entries()) {
|
|
18
|
+
fields.push(field[1]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return fields;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { Fields };
|
|
26
|
+
//# sourceMappingURL=Fields.js.map
|
|
@@ -0,0 +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":[],"mappings":";;;MAUa,MAAM,CAAA;IACf,OAAO,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAA;AAC7H,QAAA,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB,CAAC;QAC1D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrD,SAAA;AACD,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACpD;IAED,OAAO,gBAAgB,CAAC,MAAmB,EAAA;QACvC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB,CAAC;AACjF,YAAA,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,aAAA;AACJ,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACjB;AACJ;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IEquatable } from './IEquatable';
|
|
2
|
+
export declare class Guid implements IEquatable {
|
|
3
|
+
readonly bytes: number[] | Uint8Array;
|
|
4
|
+
static readonly empty: Guid;
|
|
5
|
+
private _stringVersion;
|
|
6
|
+
constructor(bytes: number[] | Uint8Array);
|
|
7
|
+
static create(): Guid;
|
|
8
|
+
static parse(guid: string): Guid;
|
|
9
|
+
static as<T extends Guid = Guid>(input: string | T): T;
|
|
10
|
+
equals(other: any): boolean;
|
|
11
|
+
toString(): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Guid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Guid.d.ts","sourceRoot":"","sources":["../../Guid.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAmB1C,qBAAa,IAAK,YAAW,UAAU;IAcvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU;IATjD,MAAM,CAAC,QAAQ,CAAC,KAAK,OAA8D;IAEnF,OAAO,CAAC,cAAc,CAAM;gBAOP,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU;IAiBjD,MAAM,CAAC,MAAM,IAAI,IAAI;IAgCrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBhC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC;IAUtD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAQ3B,QAAQ,IAAI,MAAM;CAGrB"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Guid = void 0;
|
|
4
1
|
const lookUpTable = [];
|
|
5
2
|
(() => {
|
|
6
3
|
for (let i = 0; i < 256; i += 1) {
|
|
@@ -72,6 +69,7 @@ class Guid {
|
|
|
72
69
|
return this._stringVersion;
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
|
-
exports.Guid = Guid;
|
|
76
72
|
Guid.empty = new Guid([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
|
77
|
-
|
|
73
|
+
|
|
74
|
+
export { Guid };
|
|
75
|
+
//# sourceMappingURL=Guid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Guid.js","sources":["../../Guid.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 { IEquatable } from './IEquatable';\n\nconst lookUpTable: string[] = [];\n(() => {\n for (let i = 0; i < 256; i += 1) {\n lookUpTable[i] = (i < 16 ? '0' : '') + (i).toString(16);\n }\n})();\n\nconst getString = (num: number) => {\n return num.toString(16).padStart(2, '0');\n};\n\n/**\n * Represents a Guid according to the http://www.ietf.org/rfc/rfc4122.txt\n *\n * @export\n * @class Guid\n */\nexport class Guid implements IEquatable {\n\n /**\n * Gets an empty {Guid}\n */\n static readonly empty = new Guid([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n\n private _stringVersion = '';\n\n\n /**\n * Initializes a new instance of the {Guid} class.\n * @param {number[]|Uint8Array} bytes - The 16 bytes that represents a {Guid}.\n */\n constructor(readonly bytes: number[] | Uint8Array) {\n this._stringVersion = '' +\n getString(bytes[3]) + getString(bytes[2]) + getString(bytes[1]) + getString(bytes[0]) +\n '-' +\n getString(bytes[5]) + getString(bytes[4]) +\n '-' +\n getString(bytes[7]) + getString(bytes[6]) +\n '-' +\n getString(bytes[8]) + getString(bytes[9]) +\n '-' +\n getString(bytes[10]) + getString(bytes[11]) + getString(bytes[12]) + getString(bytes[13]) + getString(bytes[14]) + getString(bytes[15]);\n }\n\n /**\n * Create a new {Guid}\n * @returns {Guid}\n */\n static create(): Guid {\n const d0 = Math.random() * 0xFFFFFFFF | 0;\n const d1 = Math.random() * 0xFFFFFFFF | 0;\n const d2 = Math.random() * 0xFFFFFFFF | 0;\n const d3 = Math.random() * 0xFFFFFFFF | 0;\n\n const bytes = [\n lookUpTable[d0 & 0xFF],\n lookUpTable[d0 >> 8 & 0xFF],\n lookUpTable[d0 >> 16 & 0xFF],\n lookUpTable[d0 >> 24 & 0xFF],\n lookUpTable[d1 & 0xFF],\n lookUpTable[d1 >> 8 & 0xFF],\n lookUpTable[d1 >> 16 & 0x0F | 0x40],\n lookUpTable[d1 >> 24 & 0xFF],\n lookUpTable[d2 & 0x3F | 0x80],\n lookUpTable[d2 >> 8 & 0xFF],\n lookUpTable[d2 >> 16 & 0xFF],\n lookUpTable[d2 >> 24 & 0xFF],\n lookUpTable[d3 & 0xFF],\n lookUpTable[d3 >> 8 & 0xFF],\n lookUpTable[d3 >> 16 & 0xFF],\n lookUpTable[d3 >> 24 & 0xFF]\n ];\n\n return new Guid(bytes.map(_ => parseInt(`0x${_}`, 16)));\n }\n\n /**\n * Parses a string and turns it into a {Guid}.\n * @param {string} guid String representation of guid.\n */\n static parse(guid: string): Guid {\n const bytes: number[] = [];\n guid.split('-').map((number, index) => {\n const bytesInChar = index < 3 ? number.match(/.{1,2}/g)?.reverse() : number.match(/.{1,2}/g);\n bytesInChar?.map((byte) => { bytes.push(parseInt(byte, 16)); });\n });\n\n return new Guid(bytes);\n }\n\n /**\n * Parses if the type is a string parse, otherwise pass through the input as desired output type.\n * @template T Type to handle for\n * @param {string|T} input String or the generic type.\n * @returns identifier Parsed or passed through\n */\n static as<T extends Guid = Guid>(input: string | T): T {\n if (typeof input === 'string') {\n return Guid.parse(input) as T;\n }\n return input as T;\n }\n\n /**\n * @inheritdoc\n */\n equals(other: any): boolean {\n return Guid.as(other).toString() === this.toString();\n }\n\n /**\n * Return a string representation of the {Guid} in the format: 00000000-0000-0000-0000-000000000000\n * @returns {string}\n */\n toString(): string {\n return this._stringVersion;\n }\n}\n"],"names":[],"mappings":"AAKA,MAAM,WAAW,GAAa,EAAE,CAAC;AACjC,CAAC,MAAK;AACF,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;QAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3D,KAAA;AACL,CAAC,GAAG,CAAC;AAEL,MAAM,SAAS,GAAG,CAAC,GAAW,KAAI;AAC9B,IAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC,CAAC;MAQW,IAAI,CAAA;AAcb,IAAA,WAAA,CAAqB,KAA4B,EAAA;QAA5B,IAAK,CAAA,KAAA,GAAL,KAAK,CAAuB;QAPzC,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;QAQxB,IAAI,CAAC,cAAc,GAAG,EAAE;AACpB,YAAA,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrF,GAAG;AACH,YAAA,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG;AACH,YAAA,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG;AACH,YAAA,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG;YACH,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;KAC/I;AAMD,IAAA,OAAO,MAAM,GAAA;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;AAE1C,QAAA,MAAM,KAAK,GAAG;AACV,YAAA,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;AACtB,YAAA,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;AACtB,YAAA,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;YAC3B,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACnC,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7B,YAAA,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;AACtB,YAAA,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5B,YAAA,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;SAC/B,CAAC;QAEF,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;KAC3D;IAMD,OAAO,KAAK,CAAC,IAAY,EAAA;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;;YAClC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7F,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,GAAG,CAAC,CAAC,IAAI,KAAO,EAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpE,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;KAC1B;IAQD,OAAO,EAAE,CAAwB,KAAiB,EAAA;AAC9C,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;AACjC,SAAA;AACD,QAAA,OAAO,KAAU,CAAC;KACrB;AAKD,IAAA,MAAM,CAAC,KAAU,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;KACxD;IAMD,QAAQ,GAAA;QACJ,OAAO,IAAI,CAAC,cAAc,CAAC;KAC9B;;AA9Fe,IAAA,CAAA,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IEquatable.d.ts","sourceRoot":"","sources":["../../IEquatable.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IAOvB,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAA;CAC9B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Constructor } from './Constructor';
|
|
2
|
+
export declare class JsonSerializer {
|
|
3
|
+
static readonly DerivedTypeIdProperty: string;
|
|
4
|
+
static deserialize<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult;
|
|
5
|
+
static deserializeArray<TResult extends {}>(targetType: Constructor<TResult>, json: string): TResult[];
|
|
6
|
+
static deserializeFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instance: any): TResult;
|
|
7
|
+
static deserializeArrayFromInstance<TResult extends {}>(targetType: Constructor<TResult>, instances: any): TResult[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=JsonSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA+B5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAQjE,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAW/F,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAWtG,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAmC5G,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CASvH"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Fields } from './Fields.js';
|
|
2
|
+
import { DerivedType } from './DerivedType.js';
|
|
3
|
+
|
|
4
|
+
const typeSerializers = new Map([
|
|
5
|
+
[Number, (value) => value],
|
|
6
|
+
[String, (value) => value],
|
|
7
|
+
[Boolean, (value) => value],
|
|
8
|
+
[Date, (value) => new Date(value)]
|
|
9
|
+
]);
|
|
10
|
+
const deserializeValue = (field, value) => {
|
|
11
|
+
if (typeSerializers.has(field.type)) {
|
|
12
|
+
return typeSerializers.get(field.type)(value);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
let type = field.type;
|
|
16
|
+
if (field.derivatives.length > 0 && value[JsonSerializer.DerivedTypeIdProperty]) {
|
|
17
|
+
const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];
|
|
18
|
+
type = field.derivatives.find(_ => DerivedType.get(_) == derivedTypeId) || type;
|
|
19
|
+
}
|
|
20
|
+
return JsonSerializer.deserialize(type, JSON.stringify(value));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
class JsonSerializer {
|
|
24
|
+
static deserialize(targetType, json) {
|
|
25
|
+
const parsed = JSON.parse(json);
|
|
26
|
+
return this.deserializeFromInstance(targetType, parsed);
|
|
27
|
+
}
|
|
28
|
+
static deserializeArray(targetType, json) {
|
|
29
|
+
const parsed = JSON.parse(json);
|
|
30
|
+
return this.deserializeArrayFromInstance(targetType, parsed);
|
|
31
|
+
}
|
|
32
|
+
static deserializeFromInstance(targetType, instance) {
|
|
33
|
+
const fields = Fields.getFieldsForType(targetType);
|
|
34
|
+
const deserialized = new targetType();
|
|
35
|
+
for (const field of fields) {
|
|
36
|
+
let value = instance[field.name];
|
|
37
|
+
if (value) {
|
|
38
|
+
if (field.enumerable) {
|
|
39
|
+
value = value.map(_ => deserializeValue(field, _));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
value = deserializeValue(field, value);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
deserialized[field.name] = value;
|
|
46
|
+
}
|
|
47
|
+
if (targetType == Object) {
|
|
48
|
+
const objectFields = Object.keys(instance).filter((value, index, arr) => {
|
|
49
|
+
return !fields.some(_ => _.name == value);
|
|
50
|
+
});
|
|
51
|
+
for (const field of objectFields) {
|
|
52
|
+
deserialized[field] = instance[field];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return deserialized;
|
|
56
|
+
}
|
|
57
|
+
static deserializeArrayFromInstance(targetType, instances) {
|
|
58
|
+
const deserialized = [];
|
|
59
|
+
for (const instance of instances) {
|
|
60
|
+
deserialized.push(this.deserializeFromInstance(targetType, instance));
|
|
61
|
+
}
|
|
62
|
+
return deserialized;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
JsonSerializer.DerivedTypeIdProperty = "_derivedTypeId";
|
|
66
|
+
|
|
67
|
+
export { JsonSerializer };
|
|
68
|
+
//# sourceMappingURL=JsonSerializer.js.map
|