@colyseus/schema 4.0.1 → 4.0.3

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 (190) hide show
  1. package/{lib → build}/Metadata.d.ts +2 -2
  2. package/{lib → build}/Reflection.d.ts +13 -13
  3. package/{lib → build}/Schema.d.ts +10 -10
  4. package/{lib → build}/annotations.d.ts +10 -10
  5. package/build/codegen/languages/cpp.d.ts +3 -0
  6. package/build/codegen/languages/csharp.d.ts +4 -0
  7. package/build/codegen/languages/haxe.d.ts +3 -0
  8. package/{lib → build}/codegen/languages/java.d.ts +2 -2
  9. package/build/codegen/languages/js.d.ts +3 -0
  10. package/build/codegen/languages/lua.d.ts +3 -0
  11. package/build/codegen/languages/ts.d.ts +3 -0
  12. package/{lib → build}/codegen/parser.d.ts +1 -1
  13. package/{lib → build}/decoder/DecodeOperation.d.ts +5 -5
  14. package/{lib → build}/decoder/Decoder.d.ts +7 -7
  15. package/{lib → build}/decoder/ReferenceTracker.d.ts +1 -1
  16. package/{lib → build}/decoder/strategy/Callbacks.d.ts +11 -11
  17. package/{lib → build}/decoder/strategy/RawChanges.d.ts +2 -2
  18. package/{lib → build}/decoder/strategy/getDecoderStateCallbacks.d.ts +3 -3
  19. package/{lib → build}/encoder/ChangeTree.d.ts +11 -11
  20. package/{lib → build}/encoder/EncodeOperation.d.ts +5 -5
  21. package/{lib → build}/encoder/Encoder.d.ts +6 -6
  22. package/{lib → build}/encoder/Root.d.ts +2 -2
  23. package/{lib → build}/encoder/StateView.d.ts +1 -1
  24. package/{lib → build}/encoding/assert.d.ts +6 -6
  25. package/{lib → build}/encoding/decode.d.ts +1 -1
  26. package/{lib → build}/encoding/encode.d.ts +1 -1
  27. package/build/{cjs/index.js → index.cjs} +1 -1
  28. package/build/index.cjs.map +1 -0
  29. package/build/index.d.ts +32 -0
  30. package/build/index.mjs.map +1 -0
  31. package/{lib → build}/types/HelperTypes.d.ts +6 -6
  32. package/{lib → build}/types/TypeContext.d.ts +1 -1
  33. package/{lib → build}/types/custom/ArraySchema.d.ts +8 -8
  34. package/{lib → build}/types/custom/CollectionSchema.d.ts +7 -7
  35. package/{lib → build}/types/custom/MapSchema.d.ts +7 -7
  36. package/{lib → build}/types/custom/SetSchema.d.ts +7 -7
  37. package/{lib → build}/types/registry.d.ts +2 -2
  38. package/{lib → build}/utils.d.ts +1 -1
  39. package/package.json +15 -14
  40. package/src/Metadata.ts +5 -5
  41. package/src/Reflection.ts +7 -7
  42. package/src/Schema.ts +11 -11
  43. package/src/annotations.ts +13 -13
  44. package/src/codegen/api.ts +10 -3
  45. package/src/codegen/cli.ts +2 -2
  46. package/src/codegen/languages/cpp.ts +2 -2
  47. package/src/codegen/languages/csharp.ts +3 -3
  48. package/src/codegen/languages/haxe.ts +2 -2
  49. package/src/codegen/languages/java.ts +2 -2
  50. package/src/codegen/languages/js.ts +2 -2
  51. package/src/codegen/languages/lua.ts +2 -2
  52. package/src/codegen/languages/ts.ts +2 -2
  53. package/src/codegen/parser.ts +7 -2
  54. package/src/codegen/types.ts +5 -0
  55. package/src/decoder/DecodeOperation.ts +14 -14
  56. package/src/decoder/Decoder.ts +11 -11
  57. package/src/decoder/ReferenceTracker.ts +8 -8
  58. package/src/decoder/strategy/Callbacks.ts +12 -12
  59. package/src/decoder/strategy/RawChanges.ts +2 -2
  60. package/src/decoder/strategy/getDecoderStateCallbacks.ts +10 -10
  61. package/src/encoder/ChangeTree.ts +13 -13
  62. package/src/encoder/EncodeOperation.ts +9 -9
  63. package/src/encoder/Encoder.ts +10 -10
  64. package/src/encoder/Root.ts +4 -4
  65. package/src/encoder/StateView.ts +7 -7
  66. package/src/encoding/assert.ts +6 -6
  67. package/src/encoding/decode.ts +1 -1
  68. package/src/encoding/encode.ts +1 -1
  69. package/src/index.ts +27 -27
  70. package/src/types/HelperTypes.ts +6 -6
  71. package/src/types/TypeContext.ts +3 -3
  72. package/src/types/custom/ArraySchema.ts +11 -11
  73. package/src/types/custom/CollectionSchema.ts +9 -9
  74. package/src/types/custom/MapSchema.ts +10 -10
  75. package/src/types/custom/SetSchema.ts +9 -9
  76. package/src/types/registry.ts +3 -3
  77. package/src/utils.ts +3 -3
  78. package/src/v3_bench.ts +1 -1
  79. package/build/cjs/index.js.map +0 -1
  80. package/build/esm/index.mjs.map +0 -1
  81. package/lib/Metadata.js +0 -260
  82. package/lib/Metadata.js.map +0 -1
  83. package/lib/Reflection.js +0 -182
  84. package/lib/Reflection.js.map +0 -1
  85. package/lib/Schema.js +0 -356
  86. package/lib/Schema.js.map +0 -1
  87. package/lib/annotations.js +0 -484
  88. package/lib/annotations.js.map +0 -1
  89. package/lib/bench_encode.d.ts +0 -1
  90. package/lib/bench_encode.js +0 -126
  91. package/lib/bench_encode.js.map +0 -1
  92. package/lib/codegen/api.js +0 -87
  93. package/lib/codegen/api.js.map +0 -1
  94. package/lib/codegen/argv.js +0 -41
  95. package/lib/codegen/argv.js.map +0 -1
  96. package/lib/codegen/cli.js +0 -63
  97. package/lib/codegen/cli.js.map +0 -1
  98. package/lib/codegen/languages/cpp.d.ts +0 -3
  99. package/lib/codegen/languages/cpp.js +0 -261
  100. package/lib/codegen/languages/cpp.js.map +0 -1
  101. package/lib/codegen/languages/csharp.d.ts +0 -4
  102. package/lib/codegen/languages/csharp.js +0 -157
  103. package/lib/codegen/languages/csharp.js.map +0 -1
  104. package/lib/codegen/languages/haxe.d.ts +0 -3
  105. package/lib/codegen/languages/haxe.js +0 -103
  106. package/lib/codegen/languages/haxe.js.map +0 -1
  107. package/lib/codegen/languages/java.js +0 -103
  108. package/lib/codegen/languages/java.js.map +0 -1
  109. package/lib/codegen/languages/js.d.ts +0 -3
  110. package/lib/codegen/languages/js.js +0 -104
  111. package/lib/codegen/languages/js.js.map +0 -1
  112. package/lib/codegen/languages/lua.d.ts +0 -3
  113. package/lib/codegen/languages/lua.js +0 -106
  114. package/lib/codegen/languages/lua.js.map +0 -1
  115. package/lib/codegen/languages/ts.d.ts +0 -3
  116. package/lib/codegen/languages/ts.js +0 -119
  117. package/lib/codegen/languages/ts.js.map +0 -1
  118. package/lib/codegen/parser.js +0 -364
  119. package/lib/codegen/parser.js.map +0 -1
  120. package/lib/codegen/types.js +0 -181
  121. package/lib/codegen/types.js.map +0 -1
  122. package/lib/decoder/DecodeOperation.js +0 -255
  123. package/lib/decoder/DecodeOperation.js.map +0 -1
  124. package/lib/decoder/Decoder.js +0 -118
  125. package/lib/decoder/Decoder.js.map +0 -1
  126. package/lib/decoder/ReferenceTracker.js +0 -139
  127. package/lib/decoder/ReferenceTracker.js.map +0 -1
  128. package/lib/decoder/strategy/Callbacks.js +0 -340
  129. package/lib/decoder/strategy/Callbacks.js.map +0 -1
  130. package/lib/decoder/strategy/RawChanges.js +0 -7
  131. package/lib/decoder/strategy/RawChanges.js.map +0 -1
  132. package/lib/decoder/strategy/getDecoderStateCallbacks.js +0 -277
  133. package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +0 -1
  134. package/lib/encoder/ChangeTree.js +0 -542
  135. package/lib/encoder/ChangeTree.js.map +0 -1
  136. package/lib/encoder/EncodeOperation.js +0 -139
  137. package/lib/encoder/EncodeOperation.js.map +0 -1
  138. package/lib/encoder/Encoder.js +0 -208
  139. package/lib/encoder/Encoder.js.map +0 -1
  140. package/lib/encoder/Root.js +0 -233
  141. package/lib/encoder/Root.js.map +0 -1
  142. package/lib/encoder/StateView.js +0 -284
  143. package/lib/encoder/StateView.js.map +0 -1
  144. package/lib/encoding/assert.js +0 -55
  145. package/lib/encoding/assert.js.map +0 -1
  146. package/lib/encoding/decode.js +0 -221
  147. package/lib/encoding/decode.js.map +0 -1
  148. package/lib/encoding/encode.js +0 -282
  149. package/lib/encoding/encode.js.map +0 -1
  150. package/lib/encoding/spec.js +0 -29
  151. package/lib/encoding/spec.js.map +0 -1
  152. package/lib/index.d.ts +0 -32
  153. package/lib/index.js +0 -81
  154. package/lib/index.js.map +0 -1
  155. package/lib/symbol.shim.js +0 -4
  156. package/lib/symbol.shim.js.map +0 -1
  157. package/lib/types/HelperTypes.js +0 -3
  158. package/lib/types/HelperTypes.js.map +0 -1
  159. package/lib/types/TypeContext.js +0 -147
  160. package/lib/types/TypeContext.js.map +0 -1
  161. package/lib/types/custom/ArraySchema.js +0 -737
  162. package/lib/types/custom/ArraySchema.js.map +0 -1
  163. package/lib/types/custom/CollectionSchema.js +0 -174
  164. package/lib/types/custom/CollectionSchema.js.map +0 -1
  165. package/lib/types/custom/MapSchema.js +0 -226
  166. package/lib/types/custom/MapSchema.js.map +0 -1
  167. package/lib/types/custom/SetSchema.js +0 -182
  168. package/lib/types/custom/SetSchema.js.map +0 -1
  169. package/lib/types/registry.js +0 -37
  170. package/lib/types/registry.js.map +0 -1
  171. package/lib/types/symbols.js +0 -37
  172. package/lib/types/symbols.js.map +0 -1
  173. package/lib/types/utils.js +0 -16
  174. package/lib/types/utils.js.map +0 -1
  175. package/lib/utils.js +0 -54
  176. package/lib/utils.js.map +0 -1
  177. package/lib/v3_bench.js +0 -130
  178. package/lib/v3_bench.js.map +0 -1
  179. package/src/bench_encode.ts +0 -64
  180. /package/{lib → build}/codegen/api.d.ts +0 -0
  181. /package/{lib → build}/codegen/argv.d.ts +0 -0
  182. /package/{lib → build}/codegen/cli.d.ts +0 -0
  183. /package/{lib → build}/codegen/types.d.ts +0 -0
  184. /package/{lib → build}/encoding/spec.d.ts +0 -0
  185. /package/build/{umd/index.js → index.js} +0 -0
  186. /package/build/{esm/index.mjs → index.mjs} +0 -0
  187. /package/{lib → build}/symbol.shim.d.ts +0 -0
  188. /package/{lib → build}/types/symbols.d.ts +0 -0
  189. /package/{lib → build}/types/utils.d.ts +0 -0
  190. /package/{lib → build}/v3_bench.d.ts +0 -0
@@ -1,147 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TypeContext = void 0;
4
- const Metadata_1 = require("../Metadata");
5
- const Schema_1 = require("../Schema");
6
- const symbols_1 = require("./symbols");
7
- class TypeContext {
8
- /**
9
- * For inheritance support
10
- * Keeps track of which classes extends which. (parent -> children)
11
- */
12
- static { this.inheritedTypes = new Map(); }
13
- static { this.cachedContexts = new Map(); }
14
- static register(target) {
15
- const parent = Object.getPrototypeOf(target);
16
- if (parent !== Schema_1.Schema) {
17
- let inherits = TypeContext.inheritedTypes.get(parent);
18
- if (!inherits) {
19
- inherits = new Set();
20
- TypeContext.inheritedTypes.set(parent, inherits);
21
- }
22
- inherits.add(target);
23
- }
24
- }
25
- static cache(rootClass) {
26
- let context = TypeContext.cachedContexts.get(rootClass);
27
- if (!context) {
28
- context = new TypeContext(rootClass);
29
- TypeContext.cachedContexts.set(rootClass, context);
30
- }
31
- return context;
32
- }
33
- constructor(rootClass) {
34
- this.types = {};
35
- this.schemas = new Map();
36
- this.hasFilters = false;
37
- this.parentFiltered = {};
38
- if (rootClass) {
39
- this.discoverTypes(rootClass);
40
- }
41
- }
42
- has(schema) {
43
- return this.schemas.has(schema);
44
- }
45
- get(typeid) {
46
- return this.types[typeid];
47
- }
48
- add(schema, typeid = this.schemas.size) {
49
- // skip if already registered
50
- if (this.schemas.has(schema)) {
51
- return false;
52
- }
53
- this.types[typeid] = schema;
54
- //
55
- // Workaround to allow using an empty Schema (with no `@type()` fields)
56
- //
57
- if (schema[Symbol.metadata] === undefined) {
58
- Metadata_1.Metadata.initialize(schema);
59
- }
60
- this.schemas.set(schema, typeid);
61
- return true;
62
- }
63
- getTypeId(klass) {
64
- return this.schemas.get(klass);
65
- }
66
- discoverTypes(klass, parentType, parentIndex, parentHasViewTag) {
67
- if (parentHasViewTag) {
68
- this.registerFilteredByParent(klass, parentType, parentIndex);
69
- }
70
- // skip if already registered
71
- if (!this.add(klass)) {
72
- return;
73
- }
74
- // add classes inherited from this base class
75
- TypeContext.inheritedTypes.get(klass)?.forEach((child) => {
76
- this.discoverTypes(child, parentType, parentIndex, parentHasViewTag);
77
- });
78
- // add parent classes
79
- let parent = klass;
80
- while ((parent = Object.getPrototypeOf(parent)) &&
81
- parent !== Schema_1.Schema && // stop at root (Schema)
82
- parent !== Function.prototype // stop at root (non-Schema)
83
- ) {
84
- this.discoverTypes(parent);
85
- }
86
- const metadata = (klass[Symbol.metadata] ??= {});
87
- // if any schema/field has filters, mark "context" as having filters.
88
- if (metadata[symbols_1.$viewFieldIndexes]) {
89
- this.hasFilters = true;
90
- }
91
- for (const fieldIndex in metadata) {
92
- const index = fieldIndex;
93
- const fieldType = metadata[index].type;
94
- const fieldHasViewTag = (metadata[index].tag !== undefined);
95
- if (typeof (fieldType) === "string") {
96
- continue;
97
- }
98
- if (typeof (fieldType) === "function") {
99
- this.discoverTypes(fieldType, klass, index, parentHasViewTag || fieldHasViewTag);
100
- }
101
- else {
102
- const type = Object.values(fieldType)[0];
103
- // skip primitive types
104
- if (typeof (type) === "string") {
105
- continue;
106
- }
107
- this.discoverTypes(type, klass, index, parentHasViewTag || fieldHasViewTag);
108
- }
109
- }
110
- }
111
- /**
112
- * Keep track of which classes have filters applied.
113
- * Format: `${typeid}-${parentTypeid}-${parentIndex}`
114
- */
115
- registerFilteredByParent(schema, parentType, parentIndex) {
116
- const typeid = this.schemas.get(schema) ?? this.schemas.size;
117
- let key = `${typeid}`;
118
- if (parentType) {
119
- key += `-${this.schemas.get(parentType)}`;
120
- }
121
- key += `-${parentIndex}`;
122
- this.parentFiltered[key] = true;
123
- }
124
- debug() {
125
- let parentFiltered = "";
126
- for (const key in this.parentFiltered) {
127
- const keys = key.split("-").map(Number);
128
- const fieldIndex = keys.pop();
129
- parentFiltered += `\n\t\t`;
130
- parentFiltered += `${key}: ${keys.reverse().map((id, i) => {
131
- const klass = this.types[id];
132
- const metadata = klass[Symbol.metadata];
133
- let txt = klass.name;
134
- if (i === 0) {
135
- txt += `[${metadata[fieldIndex].name}]`;
136
- }
137
- return `${txt}`;
138
- }).join(" -> ")}`;
139
- }
140
- return `TypeContext ->\n` +
141
- `\tSchema types: ${this.schemas.size}\n` +
142
- `\thasFilters: ${this.hasFilters}\n` +
143
- `\tparentFiltered:${parentFiltered}`;
144
- }
145
- }
146
- exports.TypeContext = TypeContext;
147
- //# sourceMappingURL=TypeContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TypeContext.js","sourceRoot":"","sources":["../../src/types/TypeContext.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AACvC,sCAAmC;AACnC,uCAA8C;AAE9C,MAAa,WAAW;IAOpB;;;OAGG;aACI,mBAAc,GAAG,IAAI,GAAG,EAAqC,AAA/C,CAAgD;aAC9D,mBAAc,GAAG,IAAI,GAAG,EAA8B,AAAxC,CAAyC;IAE9D,MAAM,CAAC,QAAQ,CAAC,MAAqB;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,eAAM,EAAE,CAAC;YACpB,IAAI,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;gBACpC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrD,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAE,SAAwB;QAClC,IAAI,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YACrC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,SAAyB;QAlCrC,UAAK,GAAqC,EAAE,CAAC;QAC7C,YAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;QAE3C,eAAU,GAAY,KAAK,CAAC;QAC5B,mBAAc,GAA8C,EAAE,CAAC;QA+B3D,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,MAAqB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,MAAc;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,MAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;QACjD,6BAA6B;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAE5B,EAAE;QACF,uEAAuE;QACvE,EAAE;QACF,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACxC,mBAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,KAAoB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,aAAa,CAAC,KAAoB,EAAE,UAA0B,EAAE,WAAoB,EAAE,gBAA0B;QACpH,IAAI,gBAAgB,EAAE,CAAC;YACnB,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEjC,6CAA6C;QAC7C,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI,MAAM,GAAQ,KAAK,CAAC;QACxB,OACI,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,KAAK,eAAM,IAAI,wBAAwB;YAC7C,MAAM,KAAK,QAAQ,CAAC,SAAS,CAAC,4BAA4B;UAC5D,CAAC;YACC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAa,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAc,CAAC,CAAC;QAEvE,qEAAqE;QACrE,IAAI,QAAQ,CAAC,2BAAiB,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,UAA2B,CAAC;YAE1C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;YACvC,MAAM,eAAe,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;YAE5D,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,SAAS;YACb,CAAC;YAED,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,aAAa,CAAC,SAA0B,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,eAAe,CAAC,CAAC;YAEtG,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEzC,uBAAuB;gBACvB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC7B,SAAS;gBACb,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,IAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,eAAe,CAAC,CAAC;YACjG,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,MAAqB,EAAE,UAA0B,EAAE,WAAoB;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAE7D,IAAI,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;QACtB,IAAI,UAAU,EAAE,CAAC;YAAC,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAAC,CAAC;QAE9D,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,KAAK;QACD,IAAI,cAAc,GAAG,EAAE,CAAC;QAExB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACpC,MAAM,IAAI,GAAa,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE9B,cAAc,IAAI,QAAQ,CAAC;YAC3B,cAAc,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAa,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC;gBAAC,CAAC;gBACzD,OAAO,GAAG,GAAG,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,CAAC;QAED,OAAO,kBAAkB;YACrB,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI;YACxC,iBAAiB,IAAI,CAAC,UAAU,IAAI;YACpC,oBAAoB,cAAc,EAAE,CAAC;IAC7C,CAAC;;AAnKL,kCAqKC","sourcesContent":["import { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport { $viewFieldIndexes } from \"./symbols\";\n\nexport class TypeContext {\n types: { [id: number]: typeof Schema; } = {};\n schemas = new Map<typeof Schema, number>();\n\n hasFilters: boolean = false;\n parentFiltered: {[typeIdAndParentIndex: string]: boolean} = {};\n\n /**\n * For inheritance support\n * Keeps track of which classes extends which. (parent -> children)\n */\n static inheritedTypes = new Map<typeof Schema, Set<typeof Schema>>();\n static cachedContexts = new Map<typeof Schema, TypeContext>();\n\n static register(target: typeof Schema) {\n const parent = Object.getPrototypeOf(target);\n if (parent !== Schema) {\n let inherits = TypeContext.inheritedTypes.get(parent);\n if (!inherits) {\n inherits = new Set<typeof Schema>();\n TypeContext.inheritedTypes.set(parent, inherits);\n }\n inherits.add(target);\n }\n }\n\n static cache (rootClass: typeof Schema) {\n let context = TypeContext.cachedContexts.get(rootClass);\n if (!context) {\n context = new TypeContext(rootClass);\n TypeContext.cachedContexts.set(rootClass, context);\n }\n return context;\n }\n\n constructor(rootClass?: typeof Schema) {\n if (rootClass) {\n this.discoverTypes(rootClass);\n }\n }\n\n has(schema: typeof Schema) {\n return this.schemas.has(schema);\n }\n\n get(typeid: number) {\n return this.types[typeid];\n }\n\n add(schema: typeof Schema, typeid = this.schemas.size) {\n // skip if already registered\n if (this.schemas.has(schema)) {\n return false;\n }\n\n this.types[typeid] = schema;\n\n //\n // Workaround to allow using an empty Schema (with no `@type()` fields)\n //\n if (schema[Symbol.metadata] === undefined) {\n Metadata.initialize(schema);\n }\n\n this.schemas.set(schema, typeid);\n return true;\n }\n\n getTypeId(klass: typeof Schema) {\n return this.schemas.get(klass);\n }\n\n private discoverTypes(klass: typeof Schema, parentType?: typeof Schema, parentIndex?: number, parentHasViewTag?: boolean) {\n if (parentHasViewTag) {\n this.registerFilteredByParent(klass, parentType, parentIndex);\n }\n\n // skip if already registered\n if (!this.add(klass)) { return; }\n\n // add classes inherited from this base class\n TypeContext.inheritedTypes.get(klass)?.forEach((child) => {\n this.discoverTypes(child, parentType, parentIndex, parentHasViewTag);\n });\n\n // add parent classes\n let parent: any = klass;\n while (\n (parent = Object.getPrototypeOf(parent)) &&\n parent !== Schema && // stop at root (Schema)\n parent !== Function.prototype // stop at root (non-Schema)\n ) {\n this.discoverTypes(parent);\n }\n\n const metadata: Metadata = (klass[Symbol.metadata] ??= {} as Metadata);\n\n // if any schema/field has filters, mark \"context\" as having filters.\n if (metadata[$viewFieldIndexes]) {\n this.hasFilters = true;\n }\n\n for (const fieldIndex in metadata) {\n const index = fieldIndex as any as number;\n\n const fieldType = metadata[index].type;\n const fieldHasViewTag = (metadata[index].tag !== undefined);\n\n if (typeof (fieldType) === \"string\") {\n continue;\n }\n\n if (typeof (fieldType) === \"function\") {\n this.discoverTypes(fieldType as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n\n } else {\n const type = Object.values(fieldType)[0];\n\n // skip primitive types\n if (typeof (type) === \"string\") {\n continue;\n }\n\n this.discoverTypes(type as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n }\n }\n }\n\n /**\n * Keep track of which classes have filters applied.\n * Format: `${typeid}-${parentTypeid}-${parentIndex}`\n */\n private registerFilteredByParent(schema: typeof Schema, parentType?: typeof Schema, parentIndex?: number) {\n const typeid = this.schemas.get(schema) ?? this.schemas.size;\n\n let key = `${typeid}`;\n if (parentType) { key += `-${this.schemas.get(parentType)}`; }\n\n key += `-${parentIndex}`;\n this.parentFiltered[key] = true;\n }\n\n debug() {\n let parentFiltered = \"\";\n\n for (const key in this.parentFiltered) {\n const keys: number[] = key.split(\"-\").map(Number);\n const fieldIndex = keys.pop();\n\n parentFiltered += `\\n\\t\\t`;\n parentFiltered += `${key}: ${keys.reverse().map((id, i) => {\n const klass = this.types[id];\n const metadata: Metadata = klass[Symbol.metadata];\n let txt = klass.name;\n if (i === 0) { txt += `[${metadata[fieldIndex].name}]`; }\n return `${txt}`;\n }).join(\" -> \")}`;\n }\n\n return `TypeContext ->\\n` +\n `\\tSchema types: ${this.schemas.size}\\n` +\n `\\thasFilters: ${this.hasFilters}\\n` +\n `\\tparentFiltered:${parentFiltered}`;\n }\n\n}\n"]}