@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.
Files changed (151) hide show
  1. package/DerivedType.ts +14 -0
  2. package/Field.ts +12 -0
  3. package/Fields.ts +32 -0
  4. package/JsonSerializer.ts +110 -0
  5. package/README.md +63 -6
  6. package/d.yarnist/cjs/Constructor.d.ts +2 -0
  7. package/d.yarnist/cjs/DerivedType.d.ts +6 -0
  8. package/d.yarnist/cjs/Field.d.ts +9 -0
  9. package/d.yarnist/cjs/Fields.d.ts +8 -0
  10. package/d.yarnist/cjs/JsonSerializer.d.ts +9 -0
  11. package/d.yarnist/cjs/PropertyAccessor.d.ts +2 -0
  12. package/d.yarnist/cjs/derivedTypeDecorator.d.ts +3 -0
  13. package/d.yarnist/cjs/fieldDecorator.d.ts +3 -0
  14. package/d.yarnist/cjs/index.d.ts +13 -0
  15. package/d.yarnist/cjs/index.js +24 -0
  16. package/derivedTypeDecorator.ts +11 -0
  17. package/dist/esm/Constructor.d.ts +2 -0
  18. package/dist/esm/Constructor.d.ts.map +1 -0
  19. package/dist/esm/DerivedType.d.ts +6 -0
  20. package/dist/esm/DerivedType.d.ts.map +1 -0
  21. package/dist/esm/DerivedType.js +11 -0
  22. package/dist/esm/DerivedType.js.map +1 -0
  23. package/dist/esm/Field.d.ts +9 -0
  24. package/dist/esm/Field.d.ts.map +1 -0
  25. package/dist/esm/Field.js +11 -0
  26. package/dist/esm/Field.js.map +1 -0
  27. package/dist/esm/Fields.d.ts +8 -0
  28. package/dist/esm/Fields.d.ts.map +1 -0
  29. package/dist/esm/Fields.js +26 -0
  30. package/dist/esm/Fields.js.map +1 -0
  31. package/dist/esm/Guid.d.ts +13 -0
  32. package/dist/esm/Guid.d.ts.map +1 -0
  33. package/dist/{Guid.js → esm/Guid.js} +3 -5
  34. package/dist/esm/Guid.js.map +1 -0
  35. package/dist/esm/IEquatable.d.ts +4 -0
  36. package/dist/esm/IEquatable.d.ts.map +1 -0
  37. package/dist/esm/JsonSerializer.d.ts +9 -0
  38. package/dist/esm/JsonSerializer.d.ts.map +1 -0
  39. package/dist/esm/JsonSerializer.js +68 -0
  40. package/dist/esm/JsonSerializer.js.map +1 -0
  41. package/dist/esm/PropertyAccessor.d.ts +2 -0
  42. package/dist/esm/PropertyAccessor.d.ts.map +1 -0
  43. package/dist/esm/PropertyAccessorDescriptor.d.ts +10 -0
  44. package/dist/esm/PropertyAccessorDescriptor.d.ts.map +1 -0
  45. package/dist/{PropertyAccessorDescriptor.js → esm/PropertyAccessorDescriptor.js} +3 -5
  46. package/dist/esm/PropertyAccessorDescriptor.js.map +1 -0
  47. package/dist/esm/PropertyPathResolverProxyHandler.d.ts +12 -0
  48. package/dist/esm/PropertyPathResolverProxyHandler.d.ts.map +1 -0
  49. package/dist/{PropertyPathResolverProxyHandler.js → esm/PropertyPathResolverProxyHandler.js} +3 -5
  50. package/dist/esm/PropertyPathResolverProxyHandler.js.map +1 -0
  51. package/dist/esm/derivedTypeDecorator.d.ts +3 -0
  52. package/dist/esm/derivedTypeDecorator.d.ts.map +1 -0
  53. package/dist/esm/derivedTypeDecorator.js +11 -0
  54. package/dist/esm/derivedTypeDecorator.js.map +1 -0
  55. package/dist/esm/fieldDecorator.d.ts +3 -0
  56. package/dist/esm/fieldDecorator.d.ts.map +1 -0
  57. package/dist/esm/fieldDecorator.js +10 -0
  58. package/dist/esm/fieldDecorator.js.map +1 -0
  59. package/dist/esm/index.d.ts +13 -0
  60. package/dist/esm/index.d.ts.map +1 -0
  61. package/dist/esm/index.js +10 -0
  62. package/dist/esm/index.js.map +1 -0
  63. package/fieldDecorator.ts +11 -0
  64. package/for_Fields/when_adding_fiields_to_type.ts +42 -0
  65. package/for_JsonSerializer/when_deserializing_complex_nested_object_with_multiple_wellknown_types.ts +116 -0
  66. package/for_JsonSerializer/when_deserializing_json_array.ts +44 -0
  67. package/for_JsonSerializer/when_deserializing_object_with_any_object_on_it.ts +30 -0
  68. package/index.ts +6 -0
  69. package/package.json +25 -15
  70. package/dist/Constructor.d.ts +0 -2
  71. package/dist/Constructor.d.ts.map +0 -1
  72. package/dist/Constructor.js +0 -3
  73. package/dist/Constructor.js.map +0 -1
  74. package/dist/Guid.d.ts.map +0 -1
  75. package/dist/Guid.js.map +0 -1
  76. package/dist/IEquatable.d.ts.map +0 -1
  77. package/dist/IEquatable.js +0 -3
  78. package/dist/IEquatable.js.map +0 -1
  79. package/dist/PropertyAccessor.d.ts +0 -2
  80. package/dist/PropertyAccessor.d.ts.map +0 -1
  81. package/dist/PropertyAccessor.js +0 -3
  82. package/dist/PropertyAccessor.js.map +0 -1
  83. package/dist/PropertyAccessorDescriptor.d.ts.map +0 -1
  84. package/dist/PropertyAccessorDescriptor.js.map +0 -1
  85. package/dist/PropertyPathResolverProxyHandler.d.ts.map +0 -1
  86. package/dist/PropertyPathResolverProxyHandler.js.map +0 -1
  87. package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.d.ts +0 -2
  88. package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.d.ts.map +0 -1
  89. package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.js +0 -9
  90. package/dist/for_Guid/when_checking_equality/of_a_guid_and_a_number.js.map +0 -1
  91. package/dist/for_Guid/when_checking_equality/of_two_different_guids.d.ts +0 -2
  92. package/dist/for_Guid/when_checking_equality/of_two_different_guids.d.ts.map +0 -1
  93. package/dist/for_Guid/when_checking_equality/of_two_different_guids.js +0 -9
  94. package/dist/for_Guid/when_checking_equality/of_two_different_guids.js.map +0 -1
  95. package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.d.ts +0 -2
  96. package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.d.ts.map +0 -1
  97. package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.js +0 -9
  98. package/dist/for_Guid/when_checking_equality/of_two_different_guids_when_one_is_a_string.js.map +0 -1
  99. package/dist/for_Guid/when_checking_equality/of_two_equal_guids.d.ts +0 -2
  100. package/dist/for_Guid/when_checking_equality/of_two_equal_guids.d.ts.map +0 -1
  101. package/dist/for_Guid/when_checking_equality/of_two_equal_guids.js +0 -9
  102. package/dist/for_Guid/when_checking_equality/of_two_equal_guids.js.map +0 -1
  103. package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.d.ts +0 -2
  104. package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.d.ts.map +0 -1
  105. package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.js +0 -9
  106. package/dist/for_Guid/when_checking_equality/of_two_equal_guids_when_one_is_a_string.js.map +0 -1
  107. package/dist/for_Guid/when_constructing_using_uint8array.d.ts +0 -2
  108. package/dist/for_Guid/when_constructing_using_uint8array.d.ts.map +0 -1
  109. package/dist/for_Guid/when_constructing_using_uint8array.js +0 -10
  110. package/dist/for_Guid/when_constructing_using_uint8array.js.map +0 -1
  111. package/dist/for_Guid/when_converting_to_string.d.ts +0 -2
  112. package/dist/for_Guid/when_converting_to_string.d.ts.map +0 -1
  113. package/dist/for_Guid/when_converting_to_string.js +0 -11
  114. package/dist/for_Guid/when_converting_to_string.js.map +0 -1
  115. package/dist/for_Guid/when_creating.d.ts +0 -2
  116. package/dist/for_Guid/when_creating.d.ts.map +0 -1
  117. package/dist/for_Guid/when_creating.js +0 -8
  118. package/dist/for_Guid/when_creating.js.map +0 -1
  119. package/dist/for_Guid/when_getting_as/and_input_is_specific_type.d.ts +0 -2
  120. package/dist/for_Guid/when_getting_as/and_input_is_specific_type.d.ts.map +0 -1
  121. package/dist/for_Guid/when_getting_as/and_input_is_specific_type.js +0 -12
  122. package/dist/for_Guid/when_getting_as/and_input_is_specific_type.js.map +0 -1
  123. package/dist/for_Guid/when_getting_as/and_input_is_string.d.ts +0 -2
  124. package/dist/for_Guid/when_getting_as/and_input_is_string.d.ts.map +0 -1
  125. package/dist/for_Guid/when_getting_as/and_input_is_string.js +0 -11
  126. package/dist/for_Guid/when_getting_as/and_input_is_string.js.map +0 -1
  127. package/dist/for_Guid/when_getting_empty.d.ts +0 -2
  128. package/dist/for_Guid/when_getting_empty.d.ts.map +0 -1
  129. package/dist/for_Guid/when_getting_empty.js +0 -11
  130. package/dist/for_Guid/when_getting_empty.js.map +0 -1
  131. package/dist/for_Guid/when_parsing.d.ts +0 -2
  132. package/dist/for_Guid/when_parsing.d.ts.map +0 -1
  133. package/dist/for_Guid/when_parsing.js +0 -10
  134. package/dist/for_Guid/when_parsing.js.map +0 -1
  135. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.d.ts +0 -2
  136. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.d.ts.map +0 -1
  137. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.js +0 -19
  138. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_on_object.js.map +0 -1
  139. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.d.ts +0 -2
  140. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.d.ts.map +0 -1
  141. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.js +0 -31
  142. package/dist/for_PropertyPathResolverProxyHandler/when_accessing_property_three_levels_down.js.map +0 -1
  143. package/dist/index.d.ts +0 -7
  144. package/dist/index.d.ts.map +0 -1
  145. package/dist/index.js +0 -10
  146. package/dist/index.js.map +0 -1
  147. package/dist/tsconfig.tsbuildinfo +0 -1
  148. /package/{dist → d.yarnist/cjs}/Guid.d.ts +0 -0
  149. /package/{dist → d.yarnist/cjs}/IEquatable.d.ts +0 -0
  150. /package/{dist → d.yarnist/cjs}/PropertyAccessorDescriptor.d.ts +0 -0
  151. /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
- # cratis
1
+ # Fundamentals
2
2
 
3
- [![C# Build](https://github.com/Cratis/cratis/actions/workflows/dotnet-build.yml/badge.svg)](https://github.com/Cratis/cratis/actions/workflows/dotnet-build.yml)
4
- [![TS Build](https://github.com/Cratis/cratis/actions/workflows/node-build.yml/badge.svg)](https://github.com/Cratis/cratis/actions/workflows/node-build.yml)
5
- [![Nuget](https://img.shields.io/nuget/v/cratis)](http://nuget.org/packages/cratis)
3
+ ## Packages / Deployables
6
4
 
5
+ [![Nuget](https://img.shields.io/nuget/v/Cratis.Fundamentals?logo=nuget)](http://nuget.org/packages/cratis.fundamentals)
6
+ [![NPM](https://img.shields.io/npm/v/@cratis/fundamentals?label=@cratis/fundamentals&logo=npm)](https://www.npmjs.com/package/@cratis/fundamentals)
7
7
 
8
- ## Build notes
8
+ ## Builds
9
9
 
10
- - Orleans CodeGenerator - if it takes a long time on every build, perform a `dotnet clean` from the project you're working on and then `dotnet build` - subsequent builds should then be fast.
10
+ [![.NET Build](https://github.com/cratis/Fundamentals/actions/workflows/dotnet-build.yml/badge.svg)](https://github.com/cratis/Fundamentals/actions/workflows/dotnet-build.yml)
11
+ [![JavaScript Build](https://github.com/cratis/Fundamentals/actions/workflows/javascript-build.yml/badge.svg)](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,2 @@
1
+ export type Constructor<T extends {} = {}> = new (...args: any[]) => T;
2
+ //# sourceMappingURL=Constructor.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { Constructor } from './Constructor';
2
+ export declare class DerivedType {
3
+ static set(target: Constructor, identifier: string): void;
4
+ static get(target: Constructor): string;
5
+ }
6
+ //# sourceMappingURL=DerivedType.d.ts.map
@@ -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,2 @@
1
+ export type PropertyAccessor<T = any> = (instance: T) => any;
2
+ //# sourceMappingURL=PropertyAccessor.d.ts.map
@@ -0,0 +1,3 @@
1
+ import 'reflect-metadata';
2
+ export declare function derivedType(identifier: string): (target: any) => void;
3
+ //# sourceMappingURL=derivedTypeDecorator.d.ts.map
@@ -0,0 +1,3 @@
1
+ import { Constructor } from './Constructor';
2
+ export declare function field(targetType: Constructor, enumerable?: boolean, derivatives?: Constructor[]): (target: any, propertyKey: string) => void;
3
+ //# sourceMappingURL=fieldDecorator.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,2 @@
1
+ export type Constructor<T extends {} = {}> = new (...args: any[]) => T;
2
+ //# sourceMappingURL=Constructor.d.ts.map
@@ -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,6 @@
1
+ import { Constructor } from './Constructor';
2
+ export declare class DerivedType {
3
+ static set(target: Constructor, identifier: string): void;
4
+ static get(target: Constructor): string;
5
+ }
6
+ //# sourceMappingURL=DerivedType.d.ts.map
@@ -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,11 @@
1
+ class Field {
2
+ constructor(name, type, enumerable, derivatives) {
3
+ this.name = name;
4
+ this.type = type;
5
+ this.enumerable = enumerable;
6
+ this.derivatives = derivatives;
7
+ }
8
+ }
9
+
10
+ export { Field };
11
+ //# sourceMappingURL=Field.js.map
@@ -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
- //# sourceMappingURL=Guid.js.map
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,4 @@
1
+ export interface IEquatable {
2
+ equals(other: any): boolean;
3
+ }
4
+ //# sourceMappingURL=IEquatable.d.ts.map
@@ -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