@cratis/fundamentals 7.7.11 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/Field.ts +6 -1
  2. package/Fields.ts +2 -2
  3. package/JsonSerializer.ts +88 -1
  4. package/ValueMap.ts +46 -0
  5. package/dist/Field.d.ts +2 -1
  6. package/dist/Field.d.ts.map +1 -1
  7. package/dist/Field.js +3 -1
  8. package/dist/Field.js.map +1 -1
  9. package/dist/Fields.d.ts +1 -1
  10. package/dist/Fields.d.ts.map +1 -1
  11. package/dist/Fields.js +2 -2
  12. package/dist/Fields.js.map +1 -1
  13. package/dist/JsonSerializer.d.ts.map +1 -1
  14. package/dist/JsonSerializer.js +68 -1
  15. package/dist/JsonSerializer.js.map +1 -1
  16. package/dist/ValueMap.d.ts +8 -0
  17. package/dist/ValueMap.d.ts.map +1 -0
  18. package/dist/ValueMap.js +32 -0
  19. package/dist/ValueMap.js.map +1 -0
  20. package/dist/cjs/Field.d.ts +2 -1
  21. package/dist/cjs/Field.d.ts.map +1 -1
  22. package/dist/cjs/Field.js +3 -1
  23. package/dist/cjs/Field.js.map +1 -1
  24. package/dist/cjs/Fields.d.ts +1 -1
  25. package/dist/cjs/Fields.d.ts.map +1 -1
  26. package/dist/cjs/Fields.js +2 -2
  27. package/dist/cjs/Fields.js.map +1 -1
  28. package/dist/cjs/JsonSerializer.d.ts.map +1 -1
  29. package/dist/cjs/JsonSerializer.js +68 -1
  30. package/dist/cjs/JsonSerializer.js.map +1 -1
  31. package/dist/cjs/ValueMap.d.ts +8 -0
  32. package/dist/cjs/ValueMap.d.ts.map +1 -0
  33. package/dist/cjs/ValueMap.js +36 -0
  34. package/dist/cjs/ValueMap.js.map +1 -0
  35. package/dist/cjs/fieldDecorator.d.ts +7 -1
  36. package/dist/cjs/fieldDecorator.d.ts.map +1 -1
  37. package/dist/cjs/fieldDecorator.js +8 -2
  38. package/dist/cjs/fieldDecorator.js.map +1 -1
  39. package/dist/cjs/index.d.ts +1 -0
  40. package/dist/cjs/index.d.ts.map +1 -1
  41. package/dist/cjs/index.js +2 -0
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/esm/Field.d.ts +2 -1
  44. package/dist/esm/Field.d.ts.map +1 -1
  45. package/dist/esm/Field.js +3 -1
  46. package/dist/esm/Field.js.map +1 -1
  47. package/dist/esm/Fields.d.ts +1 -1
  48. package/dist/esm/Fields.d.ts.map +1 -1
  49. package/dist/esm/Fields.js +2 -2
  50. package/dist/esm/Fields.js.map +1 -1
  51. package/dist/esm/JsonSerializer.d.ts.map +1 -1
  52. package/dist/esm/JsonSerializer.js +68 -1
  53. package/dist/esm/JsonSerializer.js.map +1 -1
  54. package/dist/esm/ValueMap.d.ts +8 -0
  55. package/dist/esm/ValueMap.d.ts.map +1 -0
  56. package/dist/esm/ValueMap.js +34 -0
  57. package/dist/esm/ValueMap.js.map +1 -0
  58. package/dist/esm/fieldDecorator.d.ts +7 -1
  59. package/dist/esm/fieldDecorator.d.ts.map +1 -1
  60. package/dist/esm/fieldDecorator.js +8 -2
  61. package/dist/esm/fieldDecorator.js.map +1 -1
  62. package/dist/esm/index.d.ts +1 -0
  63. package/dist/esm/index.d.ts.map +1 -1
  64. package/dist/esm/index.js +1 -0
  65. package/dist/esm/index.js.map +1 -1
  66. package/dist/fieldDecorator.d.ts +7 -1
  67. package/dist/fieldDecorator.d.ts.map +1 -1
  68. package/dist/fieldDecorator.js +8 -2
  69. package/dist/fieldDecorator.js.map +1 -1
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/fieldDecorator.ts +16 -2
  76. package/for_Fields/when_adding_fiields_to_type.ts +4 -3
  77. package/for_JsonSerializer/Types.ts +12 -0
  78. package/for_JsonSerializer/when_deserializing_object_with_value_map.ts +63 -0
  79. package/for_JsonSerializer/when_serializing_object_with_value_map.ts +34 -0
  80. package/index.ts +1 -0
  81. package/package.json +1 -1
package/Field.ts CHANGED
@@ -7,6 +7,11 @@ import { Constructor } from './Constructor';
7
7
  * Represents a field on a type.
8
8
  */
9
9
  export class Field {
10
- constructor(readonly name: string, readonly type: Constructor, readonly enumerable: boolean, readonly derivatives: Constructor[]) {
10
+ constructor(
11
+ readonly name: string,
12
+ readonly type: Constructor,
13
+ readonly enumerable: boolean,
14
+ readonly derivatives: Constructor[],
15
+ readonly genericArguments: Constructor[]) {
11
16
  }
12
17
  }
package/Fields.ts CHANGED
@@ -9,12 +9,12 @@ import { Field } from './Field';
9
9
  * Represents a system working with fields on types.
10
10
  */
11
11
  export class Fields {
12
- static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]) {
12
+ static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]) {
13
13
  let fields: Map<string, Field> = new Map<string, Field>();
14
14
  if (Reflect.hasOwnMetadata('fields', target)) {
15
15
  fields = Reflect.getOwnMetadata('fields', target);
16
16
  }
17
- fields.set(field, new Field(field, fieldType, enumerable, derivatives));
17
+ fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));
18
18
  Reflect.defineMetadata('fields', fields, target);
19
19
  }
20
20
 
package/JsonSerializer.ts CHANGED
@@ -7,6 +7,7 @@ import { Field } from './Field';
7
7
  import { Fields } from './Fields';
8
8
  import { Guid } from './Guid';
9
9
  import { TimeSpan } from './TimeSpan';
10
+ import { ValueMap } from './ValueMap';
10
11
 
11
12
  /* eslint-disable @typescript-eslint/no-explicit-any */
12
13
 
@@ -18,7 +19,15 @@ const typeConverters: Map<Constructor, typeSerializer> = new Map<Constructor, ty
18
19
  [Boolean, (value: boolean) => value],
19
20
  [Date, (value: Date) => value.toISOString()],
20
21
  [Guid, (value: Guid) => value?.toString() ?? ''],
21
- [TimeSpan, (value: TimeSpan) => value?.toString() ?? '']
22
+ [TimeSpan, (value: TimeSpan) => value?.toString() ?? ''],
23
+ [ValueMap, (value: ValueMap<any, any>) => {
24
+ const converted: any = {};
25
+ for (const [key, mapValue] of value.entries()) {
26
+ converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
27
+ }
28
+
29
+ return converted;
30
+ }]
22
31
  ]);
23
32
 
24
33
  const typeSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([
@@ -49,6 +58,10 @@ const deserializeValueFromType = (type: Constructor, value: any) => {
49
58
  };
50
59
 
51
60
  const deserializeValueFromField = (field: Field, value: any) => {
61
+ if (field.type === ValueMap) {
62
+ return deserializeValueMapFromField(field, value);
63
+ }
64
+
52
65
  if (typeSerializers.has(field.type)) {
53
66
  return typeSerializers.get(field.type)!(value);
54
67
  } else {
@@ -62,6 +75,80 @@ const deserializeValueFromField = (field: Field, value: any) => {
62
75
  }
63
76
  };
64
77
 
78
+ const serializeMapKey = (key: any): string => {
79
+ if (key === undefined || key === null) {
80
+ return '';
81
+ }
82
+
83
+ if (typeof key === 'string') {
84
+ return key;
85
+ }
86
+
87
+ if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
88
+ return key.toString();
89
+ }
90
+
91
+ if (key instanceof Date) {
92
+ return key.toISOString();
93
+ }
94
+
95
+ return JsonSerializer.serialize(key);
96
+ };
97
+
98
+ const deserializeMapKey = (keyType: Constructor, key: string): any => {
99
+ if (keyType === String) {
100
+ return key;
101
+ }
102
+
103
+ if (keyType === Number) {
104
+ return Number(key);
105
+ }
106
+
107
+ if (keyType === Boolean) {
108
+ return key.toLowerCase() === 'true';
109
+ }
110
+
111
+ if (keyType === Date) {
112
+ return new Date(key);
113
+ }
114
+
115
+ if (typeSerializers.has(keyType)) {
116
+ return typeSerializers.get(keyType)!(key);
117
+ }
118
+
119
+ return JsonSerializer.deserialize(keyType, key);
120
+ };
121
+
122
+ const deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {
123
+ if (!valueType) {
124
+ return value;
125
+ }
126
+
127
+ if (typeSerializers.has(valueType)) {
128
+ return typeSerializers.get(valueType)!(value);
129
+ }
130
+
131
+ return JsonSerializer.deserialize(valueType, JSON.stringify(value));
132
+ };
133
+
134
+ const deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {
135
+ const valueMap = new ValueMap<any, any>();
136
+ const keyType = field.genericArguments[0];
137
+ const valueType = field.genericArguments[1];
138
+
139
+ if (!value || !keyType) {
140
+ return valueMap;
141
+ }
142
+
143
+ for (const key of Object.keys(value)) {
144
+ const deserializedKey = deserializeMapKey(keyType, key);
145
+ const deserializedValue = deserializeMapValue(valueType, value[key]);
146
+ valueMap.set(deserializedKey, deserializedValue);
147
+ }
148
+
149
+ return valueMap;
150
+ };
151
+
65
152
  const convertTypesOnInstance = (instance: any) => {
66
153
  if (typeConverters.has(instance.constructor)) {
67
154
  return serializeValueForType(instance.constructor, instance);
package/ValueMap.ts ADDED
@@ -0,0 +1,46 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+
6
+ /**
7
+ * Represents a map that compares object keys by value.
8
+ */
9
+ export class ValueMap<TKey, TValue> {
10
+ private readonly _entries: Array<[TKey, TValue]> = [];
11
+
12
+ set(key: TKey, value: TValue): this {
13
+ const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));
14
+ if (index >= 0) {
15
+ this._entries[index][1] = value;
16
+ } else {
17
+ this._entries.push([key, value]);
18
+ }
19
+
20
+ return this;
21
+ }
22
+
23
+ get(key: TKey): TValue | undefined {
24
+ return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];
25
+ }
26
+
27
+ entries(): IterableIterator<[TKey, TValue]> {
28
+ return this._entries.values();
29
+ }
30
+
31
+ private equals(first: TKey, second: TKey): boolean {
32
+ if (first === second) {
33
+ return true;
34
+ }
35
+
36
+ if (first === undefined || first === null || second === undefined || second === null) {
37
+ return false;
38
+ }
39
+
40
+ if (typeof first === 'object' && typeof second === 'object') {
41
+ return JSON.stringify(first) === JSON.stringify(second);
42
+ }
43
+
44
+ return false;
45
+ }
46
+ }
package/dist/Field.d.ts CHANGED
@@ -4,6 +4,7 @@ export declare class Field {
4
4
  readonly type: Constructor;
5
5
  readonly enumerable: boolean;
6
6
  readonly derivatives: Constructor[];
7
- constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[]);
7
+ readonly genericArguments: Constructor[];
8
+ constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]);
8
9
  }
9
10
  //# sourceMappingURL=Field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;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"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;IACnC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE;gBAJ/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,WAAW,EAAE,EAC1B,gBAAgB,EAAE,WAAW,EAAE;CAE/C"}
package/dist/Field.js CHANGED
@@ -3,11 +3,13 @@ export class Field {
3
3
  type;
4
4
  enumerable;
5
5
  derivatives;
6
- constructor(name, type, enumerable, derivatives) {
6
+ genericArguments;
7
+ constructor(name, type, enumerable, derivatives, genericArguments) {
7
8
  this.name = name;
8
9
  this.type = type;
9
10
  this.enumerable = enumerable;
10
11
  this.derivatives = derivatives;
12
+ this.genericArguments = genericArguments;
11
13
  }
12
14
  }
13
15
  //# sourceMappingURL=Field.js.map
package/dist/Field.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAQC,MAAM,OAAO,KAAK;IACM;IAAuB;IAA4B;IAA8B;IAAtG,YAAqB,IAAY,EAAW,IAAiB,EAAW,UAAmB,EAAW,WAA0B;QAA3G,SAAI,GAAJ,IAAI,CAAQ;QAAW,SAAI,GAAJ,IAAI,CAAa;QAAW,eAAU,GAAV,UAAU,CAAS;QAAW,gBAAW,GAAX,WAAW,CAAe;IAChI,CAAC;CACJ"}
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../Field.ts"],"names":[],"mappings":"AAQC,MAAM,OAAO,KAAK;IAEF;IACA;IACA;IACA;IACA;IALb,YACa,IAAY,EACZ,IAAiB,EACjB,UAAmB,EACnB,WAA0B,EAC1B,gBAA+B;QAJ/B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAa;QACjB,eAAU,GAAV,UAAU,CAAS;QACnB,gBAAW,GAAX,WAAW,CAAe;QAC1B,qBAAgB,GAAhB,gBAAgB,CAAe;IAC5C,CAAC;CACJ"}
package/dist/Fields.d.ts CHANGED
@@ -2,7 +2,7 @@ import 'reflect-metadata';
2
2
  import { Constructor } from './Constructor';
3
3
  import { Field } from './Field';
4
4
  export declare class Fields {
5
- static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
5
+ static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]): void;
6
6
  static getFieldsForType(target: Constructor): Field[];
7
7
  }
8
8
  //# sourceMappingURL=Fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;IASjI,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
1
+ {"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE;IASlK,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
package/dist/Fields.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import 'reflect-metadata';
2
2
  import { Field } from './Field';
3
3
  export class Fields {
4
- static addFieldToType(target, field, fieldType, enumerable, derivatives) {
4
+ static addFieldToType(target, field, fieldType, enumerable, derivatives, genericArguments) {
5
5
  let fields = new Map();
6
6
  if (Reflect.hasOwnMetadata('fields', target)) {
7
7
  fields = Reflect.getOwnMetadata('fields', target);
8
8
  }
9
- fields.set(field, new Field(field, fieldType, enumerable, derivatives));
9
+ fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));
10
10
  Reflect.defineMetadata('fields', fields, target);
11
11
  }
12
12
  static getFieldsForType(target) {
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.js","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,OAAO,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B;QAC7H,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB,CAAC;QAC1D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAmB;QACvC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
1
+ {"version":3,"file":"Fields.js","sourceRoot":"","sources":["../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,OAAO,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAE,gBAA+B;QAC9J,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB,CAAC;QAC1D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAmB;QACvC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAuF5C,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
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8K5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAOjE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAwChH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
@@ -2,13 +2,21 @@ import { DerivedType } from './DerivedType';
2
2
  import { Fields } from './Fields';
3
3
  import { Guid } from './Guid';
4
4
  import { TimeSpan } from './TimeSpan';
5
+ import { ValueMap } from './ValueMap';
5
6
  const typeConverters = new Map([
6
7
  [Number, (value) => value],
7
8
  [String, (value) => value],
8
9
  [Boolean, (value) => value],
9
10
  [Date, (value) => value.toISOString()],
10
11
  [Guid, (value) => value?.toString() ?? ''],
11
- [TimeSpan, (value) => value?.toString() ?? '']
12
+ [TimeSpan, (value) => value?.toString() ?? ''],
13
+ [ValueMap, (value) => {
14
+ const converted = {};
15
+ for (const [key, mapValue] of value.entries()) {
16
+ converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
17
+ }
18
+ return converted;
19
+ }]
12
20
  ]);
13
21
  const typeSerializers = new Map([
14
22
  [Number, (value) => value],
@@ -37,6 +45,9 @@ const deserializeValueFromType = (type, value) => {
37
45
  }
38
46
  };
39
47
  const deserializeValueFromField = (field, value) => {
48
+ if (field.type === ValueMap) {
49
+ return deserializeValueMapFromField(field, value);
50
+ }
40
51
  if (typeSerializers.has(field.type)) {
41
52
  return typeSerializers.get(field.type)(value);
42
53
  }
@@ -49,6 +60,62 @@ const deserializeValueFromField = (field, value) => {
49
60
  return JsonSerializer.deserialize(type, JSON.stringify(value));
50
61
  }
51
62
  };
63
+ const serializeMapKey = (key) => {
64
+ if (key === undefined || key === null) {
65
+ return '';
66
+ }
67
+ if (typeof key === 'string') {
68
+ return key;
69
+ }
70
+ if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
71
+ return key.toString();
72
+ }
73
+ if (key instanceof Date) {
74
+ return key.toISOString();
75
+ }
76
+ return JsonSerializer.serialize(key);
77
+ };
78
+ const deserializeMapKey = (keyType, key) => {
79
+ if (keyType === String) {
80
+ return key;
81
+ }
82
+ if (keyType === Number) {
83
+ return Number(key);
84
+ }
85
+ if (keyType === Boolean) {
86
+ return key.toLowerCase() === 'true';
87
+ }
88
+ if (keyType === Date) {
89
+ return new Date(key);
90
+ }
91
+ if (typeSerializers.has(keyType)) {
92
+ return typeSerializers.get(keyType)(key);
93
+ }
94
+ return JsonSerializer.deserialize(keyType, key);
95
+ };
96
+ const deserializeMapValue = (valueType, value) => {
97
+ if (!valueType) {
98
+ return value;
99
+ }
100
+ if (typeSerializers.has(valueType)) {
101
+ return typeSerializers.get(valueType)(value);
102
+ }
103
+ return JsonSerializer.deserialize(valueType, JSON.stringify(value));
104
+ };
105
+ const deserializeValueMapFromField = (field, value) => {
106
+ const valueMap = new ValueMap();
107
+ const keyType = field.genericArguments[0];
108
+ const valueType = field.genericArguments[1];
109
+ if (!value || !keyType) {
110
+ return valueMap;
111
+ }
112
+ for (const key of Object.keys(value)) {
113
+ const deserializedKey = deserializeMapKey(keyType, key);
114
+ const deserializedValue = deserializeMapValue(valueType, value[key]);
115
+ valueMap.set(deserializedKey, deserializedValue);
116
+ }
117
+ return valueMap;
118
+ };
52
119
  const convertTypesOnInstance = (instance) => {
53
120
  if (typeConverters.has(instance.constructor)) {
54
121
  return serializeValueForType(instance.constructor, instance);
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMtC,MAAM,cAAc,GAAqC,IAAI,GAAG,CAA8B;IAC1F,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC;IACpC,CAAC,IAAI,EAAE,CAAC,KAAW,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC,IAAI,EAAE,CAAC,KAAW,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,eAAe,GAAqC,IAAI,GAAG,CAA8B;IAC3F,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;IAC/B,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;IAC/B,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;IAChC,CAAC,IAAI,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,IAAI,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,IAAiB,EAAE,KAAU,EAAE,EAAE;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACJ,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,IAAiB,EAAE,KAAU,EAAE,EAAE;IAC/D,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACJ,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,KAAY,EAAE,KAAU,EAAE,EAAE;IAC3D,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACJ,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACtB,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC9E,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;YAClE,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC;QACpF,CAAC;QAED,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,QAAa,EAAE,EAAE;IAC7C,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,OAAO,qBAAqB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC1B,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACJ,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QAED,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAKF,MAAM,OAAO,cAAc;IACvB,MAAM,CAAU,qBAAqB,GAAW,gBAAgB,CAAC;IAOjE,MAAM,CAAC,SAAS,CAAC,KAAU;QACvB,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAQD,MAAM,CAAC,WAAW,CAAyB,UAAgC,EAAE,IAAY;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,uBAAuB,CAAU,UAAU,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAQD,MAAM,CAAC,gBAAgB,CAAyB,UAAgC,EAAE,IAAY;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAQD,MAAM,CAAC,uBAAuB,CAAyB,UAAgC,EAAE,QAAa;QAClG,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAyB,CAAC,CAAC;QAElE,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,OAAO,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACnB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACJ,KAAK,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACpD,CAAC;YACL,CAAC;YAED,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;QAED,IAAK,UAA0B,IAAI,MAAM,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBAC/B,YAAY,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAQD,MAAM,CAAC,4BAA4B,CAAyB,UAAgC,EAAE,SAAc;QACxG,MAAM,YAAY,GAAc,EAAE,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAU,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC"}
1
+ {"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare class ValueMap<TKey, TValue> {
2
+ private readonly _entries;
3
+ set(key: TKey, value: TValue): this;
4
+ get(key: TKey): TValue | undefined;
5
+ entries(): IterableIterator<[TKey, TValue]>;
6
+ private equals;
7
+ }
8
+ //# sourceMappingURL=ValueMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueMap.d.ts","sourceRoot":"","sources":["../ValueMap.ts"],"names":[],"mappings":"AAQA,qBAAa,QAAQ,CAAC,IAAI,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAIlC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,OAAO,CAAC,MAAM;CAejB"}
@@ -0,0 +1,32 @@
1
+ export class ValueMap {
2
+ _entries = [];
3
+ set(key, value) {
4
+ const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));
5
+ if (index >= 0) {
6
+ this._entries[index][1] = value;
7
+ }
8
+ else {
9
+ this._entries.push([key, value]);
10
+ }
11
+ return this;
12
+ }
13
+ get(key) {
14
+ return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];
15
+ }
16
+ entries() {
17
+ return this._entries.values();
18
+ }
19
+ equals(first, second) {
20
+ if (first === second) {
21
+ return true;
22
+ }
23
+ if (first === undefined || first === null || second === undefined || second === null) {
24
+ return false;
25
+ }
26
+ if (typeof first === 'object' && typeof second === 'object') {
27
+ return JSON.stringify(first) === JSON.stringify(second);
28
+ }
29
+ return false;
30
+ }
31
+ }
32
+ //# sourceMappingURL=ValueMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueMap.js","sourceRoot":"","sources":["../ValueMap.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,QAAQ;IACA,QAAQ,GAA0B,EAAE,CAAC;IAEtD,GAAG,CAAC,GAAS,EAAE,KAAa;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QACxF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAS;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,KAAW,EAAE,MAAY;QACpC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACnF,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
@@ -4,6 +4,7 @@ export declare class Field {
4
4
  readonly type: Constructor;
5
5
  readonly enumerable: boolean;
6
6
  readonly derivatives: Constructor[];
7
- constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[]);
7
+ readonly genericArguments: Constructor[];
8
+ constructor(name: string, type: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]);
8
9
  }
9
10
  //# sourceMappingURL=Field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;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"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../Field.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK3C,qBAAa,KAAK;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;IACnC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE;gBAJ/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,OAAO,EACnB,WAAW,EAAE,WAAW,EAAE,EAC1B,gBAAgB,EAAE,WAAW,EAAE;CAE/C"}
package/dist/cjs/Field.js CHANGED
@@ -5,11 +5,13 @@ class Field {
5
5
  type;
6
6
  enumerable;
7
7
  derivatives;
8
- constructor(name, type, enumerable, derivatives) {
8
+ genericArguments;
9
+ constructor(name, type, enumerable, derivatives, genericArguments) {
9
10
  this.name = name;
10
11
  this.type = type;
11
12
  this.enumerable = enumerable;
12
13
  this.derivatives = derivatives;
14
+ this.genericArguments = genericArguments;
13
15
  }
14
16
  }
15
17
 
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sources":["../../Field.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\n\n/**\n * Represents a field on a type.\n */\n export class Field {\n constructor(readonly name: string, readonly type: Constructor, readonly enumerable: boolean, readonly derivatives: Constructor[]) {\n }\n}\n"],"names":[],"mappings":";;MAQc,KAAK,CAAA;AACM,IAAA,IAAA;AAAuB,IAAA,IAAA;AAA4B,IAAA,UAAA;AAA8B,IAAA,WAAA;AAAtG,IAAA,WAAA,CAAqB,IAAY,EAAW,IAAiB,EAAW,UAAmB,EAAW,WAA0B,EAAA;QAA3G,IAAA,CAAA,IAAI,GAAJ,IAAI;QAAmB,IAAA,CAAA,IAAI,GAAJ,IAAI;QAAwB,IAAA,CAAA,UAAU,GAAV,UAAU;QAAoB,IAAA,CAAA,WAAW,GAAX,WAAW;IACjH;AACH;;;;"}
1
+ {"version":3,"file":"Field.js","sources":["../../Field.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\n\n/**\n * Represents a field on a type.\n */\n export class Field {\n constructor(\n readonly name: string,\n readonly type: Constructor,\n readonly enumerable: boolean,\n readonly derivatives: Constructor[],\n readonly genericArguments: Constructor[]) {\n }\n}\n"],"names":[],"mappings":";;MAQc,KAAK,CAAA;AAEF,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,gBAAA;IALb,WAAA,CACa,IAAY,EACZ,IAAiB,EACjB,UAAmB,EACnB,WAA0B,EAC1B,gBAA+B,EAAA;QAJ/B,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAC7B;AACH;;;;"}
@@ -2,7 +2,7 @@ import 'reflect-metadata';
2
2
  import { Constructor } from './Constructor';
3
3
  import { Field } from './Field';
4
4
  export declare class Fields {
5
- static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]): void;
5
+ static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]): void;
6
6
  static getFieldsForType(target: Constructor): Field[];
7
7
  }
8
8
  //# sourceMappingURL=Fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;IASjI,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
1
+ {"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../Fields.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,qBAAa,MAAM;IACf,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE;IASlK,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE;CAWxD"}
@@ -4,12 +4,12 @@ require('reflect-metadata');
4
4
  var Field = require('./Field.js');
5
5
 
6
6
  class Fields {
7
- static addFieldToType(target, field, fieldType, enumerable, derivatives) {
7
+ static addFieldToType(target, field, fieldType, enumerable, derivatives, genericArguments) {
8
8
  let fields = new Map();
9
9
  if (Reflect.hasOwnMetadata('fields', target)) {
10
10
  fields = Reflect.getOwnMetadata('fields', target);
11
11
  }
12
- fields.set(field, new Field.Field(field, fieldType, enumerable, derivatives));
12
+ fields.set(field, new Field.Field(field, fieldType, enumerable, derivatives, genericArguments));
13
13
  Reflect.defineMetadata('fields', fields, target);
14
14
  }
15
15
  static getFieldsForType(target) {
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.js","sources":["../../Fields.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport 'reflect-metadata';\nimport { Constructor } from './Constructor';\nimport { Field } from './Field';\n\n/**\n * Represents a system working with fields on types.\n */\nexport class Fields {\n static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[]) {\n let fields: Map<string, Field> = new Map<string, Field>();\n if (Reflect.hasOwnMetadata('fields', target)) {\n fields = Reflect.getOwnMetadata('fields', target);\n }\n fields.set(field, new Field(field, fieldType, enumerable, derivatives));\n Reflect.defineMetadata('fields', fields, target);\n }\n\n static getFieldsForType(target: Constructor): Field[] {\n const fields: Field[] = [];\n if (Reflect.hasOwnMetadata('fields', target)) {\n const fieldsMap = Reflect.getOwnMetadata('fields', target) as Map<string, Field>;\n for (const field of fieldsMap.entries()) {\n fields.push(field[1]);\n }\n }\n\n return fields;\n }\n}\n"],"names":["Field"],"mappings":";;;;;MAUa,MAAM,CAAA;IACf,OAAO,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAA;AAC7H,QAAA,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB;QACzD,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;QACrD;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIA,WAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACvE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;IACpD;IAEA,OAAO,gBAAgB,CAAC,MAAmB,EAAA;QACvC,MAAM,MAAM,GAAY,EAAE;QAC1B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB;YAChF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB;QACJ;AAEA,QAAA,OAAO,MAAM;IACjB;AACH;;;;"}
1
+ {"version":3,"file":"Fields.js","sources":["../../Fields.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport 'reflect-metadata';\nimport { Constructor } from './Constructor';\nimport { Field } from './Field';\n\n/**\n * Represents a system working with fields on types.\n */\nexport class Fields {\n static addFieldToType(target: Constructor, field: string, fieldType: Constructor, enumerable: boolean, derivatives: Constructor[], genericArguments: Constructor[]) {\n let fields: Map<string, Field> = new Map<string, Field>();\n if (Reflect.hasOwnMetadata('fields', target)) {\n fields = Reflect.getOwnMetadata('fields', target);\n }\n fields.set(field, new Field(field, fieldType, enumerable, derivatives, genericArguments));\n Reflect.defineMetadata('fields', fields, target);\n }\n\n static getFieldsForType(target: Constructor): Field[] {\n const fields: Field[] = [];\n if (Reflect.hasOwnMetadata('fields', target)) {\n const fieldsMap = Reflect.getOwnMetadata('fields', target) as Map<string, Field>;\n for (const field of fieldsMap.entries()) {\n fields.push(field[1]);\n }\n }\n\n return fields;\n }\n}\n"],"names":["Field"],"mappings":";;;;;MAUa,MAAM,CAAA;AACf,IAAA,OAAO,cAAc,CAAC,MAAmB,EAAE,KAAa,EAAE,SAAsB,EAAE,UAAmB,EAAE,WAA0B,EAAE,gBAA+B,EAAA;AAC9J,QAAA,IAAI,MAAM,GAAuB,IAAI,GAAG,EAAiB;QACzD,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;QACrD;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIA,WAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACzF,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;IACpD;IAEA,OAAO,gBAAgB,CAAC,MAAmB,EAAA;QACvC,MAAM,MAAM,GAAY,EAAE;QAC1B,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAuB;YAChF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB;QACJ;AAEA,QAAA,OAAO,MAAM;IACjB;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAuF5C,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
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8K5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAOjE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAwChH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
@@ -4,6 +4,7 @@ var DerivedType = require('./DerivedType.js');
4
4
  var Fields = require('./Fields.js');
5
5
  var Guid = require('./Guid.js');
6
6
  var TimeSpan = require('./TimeSpan.js');
7
+ var ValueMap = require('./ValueMap.js');
7
8
 
8
9
  const typeConverters = new Map([
9
10
  [Number, (value) => value],
@@ -11,7 +12,14 @@ const typeConverters = new Map([
11
12
  [Boolean, (value) => value],
12
13
  [Date, (value) => value.toISOString()],
13
14
  [Guid.Guid, (value) => value?.toString() ?? ''],
14
- [TimeSpan.TimeSpan, (value) => value?.toString() ?? '']
15
+ [TimeSpan.TimeSpan, (value) => value?.toString() ?? ''],
16
+ [ValueMap.ValueMap, (value) => {
17
+ const converted = {};
18
+ for (const [key, mapValue] of value.entries()) {
19
+ converted[serializeMapKey(key)] = convertTypesOnInstance(mapValue);
20
+ }
21
+ return converted;
22
+ }]
15
23
  ]);
16
24
  const typeSerializers = new Map([
17
25
  [Number, (value) => value],
@@ -40,6 +48,9 @@ const deserializeValueFromType = (type, value) => {
40
48
  }
41
49
  };
42
50
  const deserializeValueFromField = (field, value) => {
51
+ if (field.type === ValueMap.ValueMap) {
52
+ return deserializeValueMapFromField(field, value);
53
+ }
43
54
  if (typeSerializers.has(field.type)) {
44
55
  return typeSerializers.get(field.type)(value);
45
56
  }
@@ -52,6 +63,62 @@ const deserializeValueFromField = (field, value) => {
52
63
  return JsonSerializer.deserialize(type, JSON.stringify(value));
53
64
  }
54
65
  };
66
+ const serializeMapKey = (key) => {
67
+ if (key === undefined || key === null) {
68
+ return '';
69
+ }
70
+ if (typeof key === 'string') {
71
+ return key;
72
+ }
73
+ if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {
74
+ return key.toString();
75
+ }
76
+ if (key instanceof Date) {
77
+ return key.toISOString();
78
+ }
79
+ return JsonSerializer.serialize(key);
80
+ };
81
+ const deserializeMapKey = (keyType, key) => {
82
+ if (keyType === String) {
83
+ return key;
84
+ }
85
+ if (keyType === Number) {
86
+ return Number(key);
87
+ }
88
+ if (keyType === Boolean) {
89
+ return key.toLowerCase() === 'true';
90
+ }
91
+ if (keyType === Date) {
92
+ return new Date(key);
93
+ }
94
+ if (typeSerializers.has(keyType)) {
95
+ return typeSerializers.get(keyType)(key);
96
+ }
97
+ return JsonSerializer.deserialize(keyType, key);
98
+ };
99
+ const deserializeMapValue = (valueType, value) => {
100
+ if (!valueType) {
101
+ return value;
102
+ }
103
+ if (typeSerializers.has(valueType)) {
104
+ return typeSerializers.get(valueType)(value);
105
+ }
106
+ return JsonSerializer.deserialize(valueType, JSON.stringify(value));
107
+ };
108
+ const deserializeValueMapFromField = (field, value) => {
109
+ const valueMap = new ValueMap.ValueMap();
110
+ const keyType = field.genericArguments[0];
111
+ const valueType = field.genericArguments[1];
112
+ if (!value || !keyType) {
113
+ return valueMap;
114
+ }
115
+ for (const key of Object.keys(value)) {
116
+ const deserializedKey = deserializeMapKey(keyType, key);
117
+ const deserializedValue = deserializeMapValue(valueType, value[key]);
118
+ valueMap.set(deserializedKey, deserializedValue);
119
+ }
120
+ return valueMap;
121
+ };
55
122
  const convertTypesOnInstance = (instance) => {
56
123
  if (typeConverters.has(instance.constructor)) {
57
124
  return serializeValueForType(instance.constructor, instance);