@vworlds/vecs 1.0.15 → 1.0.17

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 (181) hide show
  1. package/README.md +249 -119
  2. package/dist/component.d.ts +52 -76
  3. package/dist/component.js +60 -45
  4. package/dist/component.js.map +1 -1
  5. package/dist/component_meta.d.ts +98 -0
  6. package/dist/component_meta.js +65 -0
  7. package/dist/component_meta.js.map +1 -0
  8. package/dist/dsl.d.ts +46 -34
  9. package/dist/dsl.js +459 -61
  10. package/dist/dsl.js.map +1 -1
  11. package/dist/entity/entity.base.d.ts +57 -0
  12. package/dist/entity/entity.base.js +81 -0
  13. package/dist/entity/entity.base.js.map +1 -0
  14. package/dist/entity/entity.components.d.ts +117 -0
  15. package/dist/entity/entity.components.js +244 -0
  16. package/dist/entity/entity.components.js.map +1 -0
  17. package/dist/entity/entity.d.ts +35 -0
  18. package/dist/entity/entity.identity.d.ts +8 -0
  19. package/dist/entity/entity.identity.js +15 -0
  20. package/dist/entity/entity.identity.js.map +1 -0
  21. package/dist/entity/entity.js +33 -0
  22. package/dist/entity/entity.js.map +1 -0
  23. package/dist/entity/entity.lifecycle.d.ts +12 -0
  24. package/dist/entity/entity.lifecycle.js +111 -0
  25. package/dist/entity/entity.lifecycle.js.map +1 -0
  26. package/dist/entity/entity.queries.d.ts +3 -0
  27. package/dist/entity/entity.queries.js +33 -0
  28. package/dist/entity/entity.queries.js.map +1 -0
  29. package/dist/entity/entity.relationships.d.ts +9 -0
  30. package/dist/entity/entity.relationships.js +74 -0
  31. package/dist/entity/entity.relationships.js.map +1 -0
  32. package/dist/entity/index.d.ts +2 -0
  33. package/dist/entity/index.js +3 -0
  34. package/dist/entity/index.js.map +1 -0
  35. package/dist/filter.d.ts +27 -8
  36. package/dist/filter.js +33 -18
  37. package/dist/filter.js.map +1 -1
  38. package/dist/index.d.ts +13 -5
  39. package/dist/index.js +13 -2
  40. package/dist/index.js.map +1 -1
  41. package/dist/inject.d.ts +80 -0
  42. package/dist/inject.js +270 -0
  43. package/dist/inject.js.map +1 -0
  44. package/dist/module.d.ts +23 -0
  45. package/dist/module.js +17 -0
  46. package/dist/module.js.map +1 -0
  47. package/dist/modules/identity.d.ts +15 -0
  48. package/dist/modules/identity.js +41 -0
  49. package/dist/modules/identity.js.map +1 -0
  50. package/dist/modules/singleton.d.ts +26 -0
  51. package/dist/modules/singleton.js +41 -0
  52. package/dist/modules/singleton.js.map +1 -0
  53. package/dist/package.json +12 -1
  54. package/dist/phase.d.ts +2 -2
  55. package/dist/query/index.d.ts +6 -0
  56. package/dist/query/index.js +5 -0
  57. package/dist/query/index.js.map +1 -0
  58. package/dist/query/query.00.base.d.ts +23 -0
  59. package/dist/query/query.00.base.js +77 -0
  60. package/dist/query/query.00.base.js.map +1 -0
  61. package/dist/query/query.01.reactive.d.ts +7 -0
  62. package/dist/query/query.01.reactive.js +58 -0
  63. package/dist/query/query.01.reactive.js.map +1 -0
  64. package/dist/query/query.02.lifecycle.d.ts +6 -0
  65. package/dist/query/query.02.lifecycle.js +63 -0
  66. package/dist/query/query.02.lifecycle.js.map +1 -0
  67. package/dist/query/query.03.tracking.d.ts +15 -0
  68. package/dist/query/query.03.tracking.js +31 -0
  69. package/dist/query/query.03.tracking.js.map +1 -0
  70. package/dist/query/query.04.callbacks.d.ts +14 -0
  71. package/dist/query/query.04.callbacks.js +65 -0
  72. package/dist/query/query.04.callbacks.js.map +1 -0
  73. package/dist/query/query.05.updates.d.ts +14 -0
  74. package/dist/query/query.05.updates.js +81 -0
  75. package/dist/query/query.05.updates.js.map +1 -0
  76. package/dist/query/query.06.predicate.d.ts +13 -0
  77. package/dist/query/query.06.predicate.js +40 -0
  78. package/dist/query/query.06.predicate.js.map +1 -0
  79. package/dist/query/query.07.groups.d.ts +41 -0
  80. package/dist/query/query.07.groups.js +110 -0
  81. package/dist/query/query.07.groups.js.map +1 -0
  82. package/dist/query/query.d.ts +53 -0
  83. package/dist/query/query.js +138 -0
  84. package/dist/query/query.js.map +1 -0
  85. package/dist/relationship.d.ts +19 -0
  86. package/dist/relationship.js +18 -0
  87. package/dist/relationship.js.map +1 -0
  88. package/dist/system.d.ts +37 -23
  89. package/dist/system.js +80 -64
  90. package/dist/system.js.map +1 -1
  91. package/dist/terms/all_term.d.ts +32 -0
  92. package/dist/terms/all_term.js +41 -0
  93. package/dist/terms/all_term.js.map +1 -0
  94. package/dist/terms/any_term.d.ts +33 -0
  95. package/dist/terms/any_term.js +42 -0
  96. package/dist/terms/any_term.js.map +1 -0
  97. package/dist/terms/build.d.ts +62 -0
  98. package/dist/terms/build.js +382 -0
  99. package/dist/terms/build.js.map +1 -0
  100. package/dist/terms/component_term.d.ts +37 -0
  101. package/dist/terms/component_term.js +49 -0
  102. package/dist/terms/component_term.js.map +1 -0
  103. package/dist/terms/empty_term.d.ts +6 -0
  104. package/dist/terms/empty_term.js +12 -0
  105. package/dist/terms/empty_term.js.map +1 -0
  106. package/dist/terms/index.d.ts +11 -0
  107. package/dist/terms/index.js +12 -0
  108. package/dist/terms/index.js.map +1 -0
  109. package/dist/terms/not_term.d.ts +35 -0
  110. package/dist/terms/not_term.js +47 -0
  111. package/dist/terms/not_term.js.map +1 -0
  112. package/dist/terms/only_term.d.ts +47 -0
  113. package/dist/terms/only_term.js +79 -0
  114. package/dist/terms/only_term.js.map +1 -0
  115. package/dist/terms/predicate_term.d.ts +80 -0
  116. package/dist/terms/predicate_term.js +109 -0
  117. package/dist/terms/predicate_term.js.map +1 -0
  118. package/dist/terms/target_term.d.ts +43 -0
  119. package/dist/terms/target_term.js +87 -0
  120. package/dist/terms/target_term.js.map +1 -0
  121. package/dist/terms/term.d.ts +94 -0
  122. package/dist/terms/term.js +202 -0
  123. package/dist/terms/term.js.map +1 -0
  124. package/dist/terms/world_term.d.ts +68 -0
  125. package/dist/terms/world_term.js +99 -0
  126. package/dist/terms/world_term.js.map +1 -0
  127. package/dist/timer.js +2 -2
  128. package/dist/timer.js.map +1 -1
  129. package/dist/util/array_map.js +12 -0
  130. package/dist/util/array_map.js.map +1 -1
  131. package/dist/util/bitset.js +107 -22
  132. package/dist/util/bitset.js.map +1 -1
  133. package/dist/util/dense_set.d.ts +1 -0
  134. package/dist/util/dense_set.js +90 -0
  135. package/dist/util/dense_set.js.map +1 -0
  136. package/dist/util/id_pool.d.ts +30 -0
  137. package/dist/util/id_pool.js +222 -0
  138. package/dist/util/id_pool.js.map +1 -0
  139. package/dist/world/index.d.ts +3 -0
  140. package/dist/world/index.js +3 -0
  141. package/dist/world/index.js.map +1 -0
  142. package/dist/world/world.base.d.ts +6 -0
  143. package/dist/world/world.base.js +21 -0
  144. package/dist/world/world.base.js.map +1 -0
  145. package/dist/world/world.components.d.ts +67 -0
  146. package/dist/world/world.components.js +93 -0
  147. package/dist/world/world.components.js.map +1 -0
  148. package/dist/world/world.d.ts +29 -0
  149. package/dist/world/world.deferred.d.ts +13 -0
  150. package/dist/world/world.deferred.js +93 -0
  151. package/dist/world/world.deferred.js.map +1 -0
  152. package/dist/world/world.entities.d.ts +18 -0
  153. package/dist/world/world.entities.js +97 -0
  154. package/dist/world/world.entities.js.map +1 -0
  155. package/dist/world/world.js +39 -0
  156. package/dist/world/world.js.map +1 -0
  157. package/dist/world/world.modules.d.ts +12 -0
  158. package/dist/world/world.modules.js +21 -0
  159. package/dist/world/world.modules.js.map +1 -0
  160. package/dist/world/world.pipeline.d.ts +21 -0
  161. package/dist/world/world.pipeline.js +106 -0
  162. package/dist/world/world.pipeline.js.map +1 -0
  163. package/dist/world/world.pools.d.ts +9 -0
  164. package/dist/world/world.pools.js +63 -0
  165. package/dist/world/world.pools.js.map +1 -0
  166. package/dist/world/world.queries.d.ts +18 -0
  167. package/dist/world/world.queries.js +101 -0
  168. package/dist/world/world.queries.js.map +1 -0
  169. package/dist/world/world.storage.d.ts +7 -0
  170. package/dist/world/world.storage.js +26 -0
  171. package/dist/world/world.storage.js.map +1 -0
  172. package/package.json +12 -1
  173. package/dist/entity.d.ts +0 -215
  174. package/dist/entity.js +0 -457
  175. package/dist/entity.js.map +0 -1
  176. package/dist/query.d.ts +0 -251
  177. package/dist/query.js +0 -353
  178. package/dist/query.js.map +0 -1
  179. package/dist/world.d.ts +0 -389
  180. package/dist/world.js +0 -631
  181. package/dist/world.js.map +0 -1
package/dist/dsl.js CHANGED
@@ -1,86 +1,484 @@
1
- import { _calculateComponentBitmask, } from "./component.js";
2
- /**
3
- * Build a predicate that returns `true` when an entity has every component
4
- * type in `components` set on its archetype.
5
- *
6
- * @internal Factory used by {@link _buildEntityTest} and by `Query.update`'s
7
- * watchlist auto-expansion.
8
- *
9
- * @param world - World used to resolve component classes to type ids.
10
- * @param components - Component classes or numeric type ids to require.
11
- */
12
- export function _HAS(world, ...components) {
13
- const testBitmask = _calculateComponentBitmask(components, world);
14
- return (e) => e.componentBitmask.hasBitset(testBitmask);
1
+ import { Entity } from "./entity/index.js";
2
+ import { ChildOf } from "./relationship.js";
3
+ import { Bitset } from "./util/bitset.js";
4
+ function _isClassConstructor(value) {
5
+ return (typeof value === "function" && Function.prototype.toString.call(value).startsWith("class "));
15
6
  }
16
- /**
17
- * Build a predicate that returns `true` only when an entity's archetype is
18
- * exactly the set in `components` (no other components attached).
19
- */
20
- function _HAS_ONLY(world, ...components) {
21
- const testBitmask = _calculateComponentBitmask(components, world);
22
- return (e) => e.componentBitmask.equal(testBitmask);
7
+ function _componentRequirements(q) {
8
+ if (typeof q === "number" || q instanceof Entity) {
9
+ return [q];
10
+ }
11
+ if (_isClassConstructor(q)) {
12
+ return [q];
13
+ }
14
+ if (q instanceof Array) {
15
+ return q;
16
+ }
17
+ return undefined;
18
+ }
19
+ function _asShortestComponentRequirement(components) {
20
+ if (components.length === 0) {
21
+ return true;
22
+ }
23
+ return components.length === 1 ? components[0] : components;
24
+ }
25
+ function _calculateComponentBitmask(types) {
26
+ const bitmask = new Bitset();
27
+ types.forEach((type) => {
28
+ bitmask.add(type);
29
+ });
30
+ return bitmask;
31
+ }
32
+ function _resolveComponentRequirement(component, world) {
33
+ return world.entity(component).eid;
34
+ }
35
+ export function _resolveRelationship(ref, world) {
36
+ const entity = world.entity(ref);
37
+ const meta = entity.ownMeta;
38
+ if (!meta.isRelationship) {
39
+ throw new Error(`Component ${meta.Class.name} is not a Relationship`);
40
+ }
41
+ return entity.eid;
23
42
  }
24
- /** Negate a predicate. */
25
- function _NOT(func) {
26
- return (e) => !func(e);
43
+ function _resolveChildOfRelationship(world) {
44
+ return _resolveRelationship(ChildOf, world);
27
45
  }
28
- /** Conjunction of multiple predicates. */
29
- function _AND(...funcs) {
30
- return (e) => funcs.every((f) => f(e));
46
+ function _resolveBareComponent(component, world) {
47
+ if (typeof component === "number") {
48
+ return component;
49
+ }
50
+ if (component instanceof Entity) {
51
+ return component.eid;
52
+ }
53
+ return world.entity(component).eid;
54
+ }
55
+ function _sortComponentRequirements(components) {
56
+ return [...components].sort((a, b) => {
57
+ const aEid = typeof a === "number" ? a : a instanceof Entity ? a.eid : undefined;
58
+ const bEid = typeof b === "number" ? b : b instanceof Entity ? b.eid : undefined;
59
+ if (aEid !== undefined && bEid !== undefined) {
60
+ return aEid - bEid;
61
+ }
62
+ if (aEid !== undefined) {
63
+ return -1;
64
+ }
65
+ if (bEid !== undefined) {
66
+ return 1;
67
+ }
68
+ return 0;
69
+ });
70
+ }
71
+ function _asShortestHasOnlyRequirement(components) {
72
+ return components.length === 1 ? components[0] : components;
73
+ }
74
+ function _asCanonicalComponentRequirement(components, world) {
75
+ return _asShortestComponentRequirement(_sortComponentRequirements(components.map((component) => _resolveComponentRequirement(component, world))));
76
+ }
77
+ function _componentSortKey(q) {
78
+ if (typeof q === "number") {
79
+ return q;
80
+ }
81
+ if (q instanceof Entity) {
82
+ return q.eid;
83
+ }
84
+ if (q instanceof Array && q.length > 0 && q.every((term) => typeof term === "number")) {
85
+ return q[0];
86
+ }
87
+ return undefined;
88
+ }
89
+ function _termSortKey(q) {
90
+ if (typeof q === "boolean") {
91
+ return q ? "0:true" : "0:false";
92
+ }
93
+ const componentSortKey = _componentSortKey(q);
94
+ if (componentSortKey !== undefined) {
95
+ return `0:${componentSortKey.toString().padStart(12, "0")}`;
96
+ }
97
+ if (typeof q === "number") {
98
+ return `0:${q.toString().padStart(12, "0")}`;
99
+ }
100
+ if (q instanceof Array) {
101
+ return `1:${q.map(_termSortKey).join(",")}`;
102
+ }
103
+ if (q instanceof Entity) {
104
+ return `0:${q.eid.toString().padStart(12, "0")}`;
105
+ }
106
+ if (typeof q === "function") {
107
+ return "5";
108
+ }
109
+ if ("all" in q) {
110
+ return `2:${q.all.map(_termSortKey).join(",")}`;
111
+ }
112
+ if ("any" in q) {
113
+ return `3:${q.any.map(_termSortKey).join(",")}`;
114
+ }
115
+ if ("not" in q) {
116
+ return `4:${_termSortKey(q.not)}`;
117
+ }
118
+ if ("target" in q) {
119
+ const rel = q.target[0] instanceof Entity ? q.target[0].eid : q.target[0];
120
+ return `4:target:${String(rel).padStart(12, "0")}:${_termSortKey(q.target[1])}`;
121
+ }
122
+ if ("source" in q) {
123
+ const rel = q.source[0] instanceof Entity ? q.source[0].eid : q.source[0];
124
+ return `4:source:${String(rel).padStart(12, "0")}:${_termSortKey(q.source[1])}`;
125
+ }
126
+ if ("parent" in q) {
127
+ return `4:parent:${_termSortKey(q.parent)}`;
128
+ }
129
+ if ("children" in q) {
130
+ return `4:children:${_termSortKey(q.children)}`;
131
+ }
132
+ if ("test" in q) {
133
+ return `5:${q.watch instanceof Array ? q.watch.map(_termSortKey).join(",") : q.watch ? _termSortKey(q.watch) : ""}`;
134
+ }
135
+ return `4:${q.only instanceof Array ? q.only.map(_termSortKey).join(",") : _termSortKey(q.only)}`;
31
136
  }
32
- /** Disjunction of multiple predicates. */
33
- function _OR(...funcs) {
34
- return (e) => funcs.some((f) => f(e));
137
+ function _sortCommutativeTerms(terms) {
138
+ return [...terms].sort((a, b) => _termSortKey(a).localeCompare(_termSortKey(b)));
35
139
  }
36
- /** Lift a predicate to apply to the entity's parent (false when no parent). */
37
- function _PARENT(func) {
38
- return (e) => (e.parent && func(e.parent)) || false;
140
+ const _dslFunctionIds = new WeakMap();
141
+ let _nextDSLFunctionId = 1;
142
+ function _getDSLFunctionId(func) {
143
+ let id = _dslFunctionIds.get(func);
144
+ if (id === undefined) {
145
+ id = _nextDSLFunctionId++;
146
+ _dslFunctionIds.set(func, id);
147
+ }
148
+ return id;
149
+ }
150
+ function _canonicalDSLKey(q) {
151
+ if (typeof q === "boolean") {
152
+ return ["BOOL", q];
153
+ }
154
+ if (typeof q === "number") {
155
+ return ["HAS", q];
156
+ }
157
+ if (q instanceof Entity) {
158
+ return ["HAS", q.eid];
159
+ }
160
+ if (typeof q === "function") {
161
+ return ["HAS", q];
162
+ }
163
+ if (q instanceof Array) {
164
+ return ["ALL", q];
165
+ }
166
+ if ("only" in q) {
167
+ return ["ONLY", q.only instanceof Array ? q.only : [q.only]];
168
+ }
169
+ if ("all" in q) {
170
+ return ["ALL", q.all.map(_canonicalDSLKey)];
171
+ }
172
+ if ("any" in q) {
173
+ return ["ANY", q.any.map(_canonicalDSLKey)];
174
+ }
175
+ if ("not" in q) {
176
+ return ["NOT", _canonicalDSLKey(q.not)];
177
+ }
178
+ if ("target" in q) {
179
+ return [
180
+ "TARGET",
181
+ q.target[0] instanceof Entity ? q.target[0].eid : q.target[0],
182
+ _canonicalDSLKey(q.target[1]),
183
+ ];
184
+ }
185
+ if ("source" in q) {
186
+ return [
187
+ "SOURCE",
188
+ q.source[0] instanceof Entity ? q.source[0].eid : q.source[0],
189
+ _canonicalDSLKey(q.source[1]),
190
+ ];
191
+ }
192
+ if ("parent" in q) {
193
+ return ["PARENT", _canonicalDSLKey(q.parent)];
194
+ }
195
+ if ("children" in q) {
196
+ return ["CHILDREN", _canonicalDSLKey(q.children)];
197
+ }
198
+ if ("test" in q) {
199
+ if (q.watch === undefined) {
200
+ return ["FUNC", _getDSLFunctionId(q.test)];
201
+ }
202
+ return ["FUNC", _getDSLFunctionId(q.test), q.watch instanceof Array ? q.watch : [q.watch]];
203
+ }
204
+ throw new Error("Unrecognized query term");
205
+ }
206
+ function _fnv1a32(input) {
207
+ let hash = 0x811c9dc5;
208
+ for (let i = 0; i < input.length; i++) {
209
+ hash ^= input.charCodeAt(i);
210
+ hash = Math.imul(hash, 0x01000193);
211
+ }
212
+ return hash >>> 0;
39
213
  }
40
214
  /**
41
- * Compile a {@link QueryDSL} expression into a runtime entity-test predicate.
215
+ * Return the shortest equivalent form of a query DSL expression.
42
216
  *
43
- * @internal Used by `Query`, `System`, and `Filter` to translate user-supplied
44
- * DSL expressions into the predicate stored on `Query._belongs`.
217
+ * @internal
45
218
  *
46
- * @param world - World used to resolve registered component classes to type ids.
47
- * @param q - Query expression.
219
+ * The simplifier resolves component classes to numeric type ids, flattens
220
+ * associative operators, removes boolean identities, unwraps singleton
221
+ * operators, sorts commutative expressions, and coalesces positive component
222
+ * requirements into the DSL's array shorthand. Explicit `{ test }` predicates
223
+ * are preserved as predicates.
48
224
  */
49
- export function _buildEntityTest(world, q) {
50
- if (typeof q === "number") {
51
- return _HAS(world, q);
225
+ export function simplifyQueryDSL(q, world) {
226
+ if (typeof q === "boolean") {
227
+ return q;
52
228
  }
53
- if (typeof q === "function" && world._tryGetComponentMeta(q)) {
54
- return _HAS(world, q);
229
+ if (q instanceof Array) {
230
+ return _asCanonicalComponentRequirement(q, world);
55
231
  }
56
- else if (typeof q === "function") {
232
+ if (typeof q === "number") {
57
233
  return q;
58
234
  }
235
+ if (q instanceof Entity) {
236
+ return q.eid;
237
+ }
238
+ if (typeof q === "function") {
239
+ return _resolveBareComponent(q, world);
240
+ }
241
+ if ("only" in q) {
242
+ const components = q.only;
243
+ return {
244
+ only: components instanceof Array
245
+ ? _asShortestHasOnlyRequirement(_sortComponentRequirements(components.map((component) => _resolveComponentRequirement(component, world))))
246
+ : _resolveComponentRequirement(components, world),
247
+ };
248
+ }
249
+ if ("all" in q) {
250
+ const simplifiedTerms = [];
251
+ for (const term of q.all.map((term) => simplifyQueryDSL(term, world))) {
252
+ if (term === false) {
253
+ return false;
254
+ }
255
+ if (term === true) {
256
+ continue;
257
+ }
258
+ if (typeof term === "object" && term !== null && !(term instanceof Array) && "all" in term) {
259
+ simplifiedTerms.push(...term.all);
260
+ }
261
+ else {
262
+ simplifiedTerms.push(term);
263
+ }
264
+ }
265
+ const componentRequirements = [];
266
+ const otherTerms = [];
267
+ for (const term of simplifiedTerms) {
268
+ const requirements = _componentRequirements(term);
269
+ if (requirements) {
270
+ componentRequirements.push(...requirements);
271
+ }
272
+ else {
273
+ otherTerms.push(term);
274
+ }
275
+ }
276
+ const terms = componentRequirements.length > 0
277
+ ? [_asCanonicalComponentRequirement(componentRequirements, world), ...otherTerms]
278
+ : otherTerms;
279
+ if (terms.length === 0) {
280
+ return true;
281
+ }
282
+ if (terms.length === 1) {
283
+ return terms[0];
284
+ }
285
+ return { all: _sortCommutativeTerms(terms) };
286
+ }
287
+ if ("any" in q) {
288
+ const terms = [];
289
+ for (const term of q.any.map((term) => simplifyQueryDSL(term, world))) {
290
+ if (term === true) {
291
+ return true;
292
+ }
293
+ if (term === false) {
294
+ continue;
295
+ }
296
+ if (typeof term === "object" && term !== null && !(term instanceof Array) && "any" in term) {
297
+ terms.push(...term.any);
298
+ }
299
+ else {
300
+ terms.push(term);
301
+ }
302
+ }
303
+ if (terms.length === 0) {
304
+ return false;
305
+ }
306
+ if (terms.length === 1) {
307
+ return terms[0];
308
+ }
309
+ return { any: _sortCommutativeTerms(terms) };
310
+ }
311
+ if ("not" in q) {
312
+ const term = simplifyQueryDSL(q.not, world);
313
+ if (typeof term === "boolean") {
314
+ return !term;
315
+ }
316
+ if (typeof term === "object" && term !== null && !(term instanceof Array) && "not" in term) {
317
+ return term.not;
318
+ }
319
+ return { not: term };
320
+ }
321
+ if ("target" in q) {
322
+ const inner = simplifyQueryDSL(q.target[1], world);
323
+ if (inner === false) {
324
+ return false;
325
+ }
326
+ return { target: [_resolveRelationship(q.target[0], world), inner] };
327
+ }
328
+ if ("source" in q) {
329
+ const inner = simplifyQueryDSL(q.source[1], world);
330
+ if (inner === false) {
331
+ return false;
332
+ }
333
+ return { source: [_resolveRelationship(q.source[0], world), inner] };
334
+ }
335
+ if ("parent" in q) {
336
+ const inner = simplifyQueryDSL(q.parent, world);
337
+ if (inner === false) {
338
+ return false;
339
+ }
340
+ return { target: [_resolveChildOfRelationship(world), inner] };
341
+ }
342
+ if ("children" in q) {
343
+ const inner = simplifyQueryDSL(q.children, world);
344
+ if (inner === false) {
345
+ return false;
346
+ }
347
+ return { source: [_resolveChildOfRelationship(world), inner] };
348
+ }
349
+ if ("test" in q) {
350
+ if (q.watch === undefined) {
351
+ return q;
352
+ }
353
+ const watch = q.watch instanceof Array ? q.watch : [q.watch];
354
+ const resolvedWatch = [
355
+ ...new Set(watch.map((component) => _resolveComponentRequirement(component, world))),
356
+ ].sort((a, b) => a - b);
357
+ return { test: q.test, watch: resolvedWatch };
358
+ }
359
+ return q;
360
+ }
361
+ export function containsDownTerm(q) {
362
+ if (typeof q !== "object" || q === null || q instanceof Array || q instanceof Entity) {
363
+ return false;
364
+ }
365
+ if ("source" in q || "children" in q) {
366
+ return true;
367
+ }
368
+ if ("all" in q) {
369
+ return q.all.some(containsDownTerm);
370
+ }
371
+ if ("any" in q) {
372
+ return q.any.some(containsDownTerm);
373
+ }
374
+ if ("not" in q) {
375
+ return containsDownTerm(q.not);
376
+ }
377
+ if ("target" in q) {
378
+ return containsDownTerm(q.target[1]);
379
+ }
380
+ if ("parent" in q) {
381
+ return containsDownTerm(q.parent);
382
+ }
383
+ return false;
384
+ }
385
+ /**
386
+ * Return a deterministic FNV-1a hash for a query DSL expression.
387
+ *
388
+ * Equivalent expressions hash identically because the DSL is simplified before
389
+ * hashing. Custom predicate functions are represented by process-local function
390
+ * identity ids. Like any 32-bit hash, collisions are theoretically possible.
391
+ */
392
+ export function getDSLKey(q, world) {
393
+ return _fnv1a32(JSON.stringify(_canonicalDSLKey(simplifyQueryDSL(q, world))));
394
+ }
395
+ /** @internal Return the canonical cache key used by materialized terms. */
396
+ export function getDSLCacheKey(q, world) {
397
+ return JSON.stringify(_canonicalDSLKey(simplifyQueryDSL(q, world)));
398
+ }
399
+ function _compileMask(context, components, entityRef, comparison) {
400
+ const mask = _calculateComponentBitmask(components);
401
+ if (comparison === "hasBitset") {
402
+ // Inline the subset check against the mask's word values so the
403
+ // generated predicate is straight-line bitwise code with no method
404
+ // dispatch and no loop over zero words. The mask itself is not
405
+ // closed over for this term.
406
+ const inline = mask._compileSubsetCheck(`${entityRef}.componentBitmask._bits`);
407
+ return inline === "true" ? "true" : `(${inline})`;
408
+ }
409
+ const maskIndex = context.masks.push(mask) - 1;
410
+ return `${entityRef}.componentBitmask.${comparison}(m${maskIndex})`;
411
+ }
412
+ function _compileQueryExpression(world, q, context, entityRef) {
413
+ if (typeof q === "boolean") {
414
+ return q ? "true" : "false";
415
+ }
416
+ if (typeof q === "number") {
417
+ return _compileMask(context, [q], entityRef, "hasBitset");
418
+ }
419
+ if (typeof q === "function") {
420
+ return _compileMask(context, [world.entity(q).eid], entityRef, "hasBitset");
421
+ }
59
422
  if (q instanceof Array) {
60
- return _HAS(world, ...q);
423
+ return _compileMask(context, q.map((component) => world.entity(component).eid), entityRef, "hasBitset");
61
424
  }
62
- if ("HAS" in q) {
63
- return _buildEntityTest(world, q.HAS);
425
+ if ("only" in q) {
426
+ const v = q.only;
427
+ return _compileMask(context, v instanceof Array
428
+ ? v.map((component) => world.entity(component).eid)
429
+ : [world.entity(v).eid], entityRef, "equal");
430
+ }
431
+ if ("all" in q) {
432
+ if (q.all.length === 0) {
433
+ return "true";
434
+ }
435
+ return q.all
436
+ .map((sq) => `(${_compileQueryExpression(world, sq, context, entityRef)})`)
437
+ .join("&&");
64
438
  }
65
- if ("HAS_ONLY" in q) {
66
- const v = q.HAS_ONLY;
67
- if (v instanceof Array) {
68
- return _HAS_ONLY(world, ...v);
439
+ if ("any" in q) {
440
+ if (q.any.length === 0) {
441
+ return "false";
69
442
  }
70
- return _HAS_ONLY(world, v);
443
+ return q.any
444
+ .map((sq) => `(${_compileQueryExpression(world, sq, context, entityRef)})`)
445
+ .join("||");
71
446
  }
72
- if ("AND" in q) {
73
- return _AND(...q.AND.map((sq) => _buildEntityTest(world, sq)));
447
+ if ("not" in q) {
448
+ return `!(${_compileQueryExpression(world, q.not, context, entityRef)})`;
74
449
  }
75
- if ("OR" in q) {
76
- return _OR(...q.OR.map((sq) => _buildEntityTest(world, sq)));
450
+ if ("target" in q) {
451
+ const relEid = _resolveRelationship(q.target[0], world);
452
+ const relMask = _compileMask(context, [relEid], entityRef, "hasBitset");
453
+ const inner = _compileQueryExpression(world, q.target[1], context, "p");
454
+ return `(${relMask})&&((p)=>p!==undefined&&(${inner}))(${entityRef}._get(${relEid})?.target)`;
77
455
  }
78
- if ("NOT" in q) {
79
- return _NOT(_buildEntityTest(world, q.NOT));
456
+ if ("source" in q) {
457
+ const relEid = _resolveRelationship(q.source[0], world);
458
+ const inner = _compileQueryExpression(world, q.source[1], context, "p");
459
+ return `((cs)=>{if(cs===undefined)return false;for(const p of cs){if(${inner})return true;}return false;})(${entityRef}._childrenByEid(${relEid}))`;
80
460
  }
81
- if ("PARENT" in q) {
82
- return _PARENT(_buildEntityTest(world, q.PARENT));
461
+ if ("test" in q) {
462
+ const funcIndex = context.funcs.push(q.test) - 1;
463
+ return `f${funcIndex}(${entityRef})`;
83
464
  }
84
- throw "Unrecognized query term";
465
+ throw new Error("Unrecognized query term");
466
+ }
467
+ /**
468
+ * Compile a {@link QueryDSL} expression into a runtime entity-test predicate.
469
+ *
470
+ * @internal Used by predicate-backed terms and the `Filter` fallback to
471
+ * translate user-supplied DSL expressions into runtime tests.
472
+ *
473
+ * @param world - World used to resolve registered component classes to type ids.
474
+ * @param q - Query expression.
475
+ */
476
+ export function _compile(world, q) {
477
+ const context = { masks: [], funcs: [] };
478
+ const expression = _compileQueryExpression(world, simplifyQueryDSL(q, world), context, "e");
479
+ const maskNames = context.masks.map((_mask, index) => `m${index}`);
480
+ const funcNames = context.funcs.map((_func, index) => `f${index}`);
481
+ const factory = new Function(...maskNames, ...funcNames, `return function entityTest(e) { return ${expression}; };`);
482
+ return factory(...context.masks, ...context.funcs);
85
483
  }
86
484
  //# sourceMappingURL=dsl.js.map
package/dist/dsl.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { ComponentMeta, type ComponentInstance, type ComponentType } from "../component_meta.js";
2
+ import { type ReadonlyArrayMap } from "../util/array_map.js";
3
+ import { Bitset } from "../util/bitset.js";
4
+ import { Events } from "../util/events.js";
5
+ import type { World } from "../world/index.js";
6
+ export type EntityEvents = Events<{
7
+ destroy(): void;
8
+ }>;
9
+ export declare class Base {
10
+ /** World that owns this entity. */
11
+ readonly world: World;
12
+ /** Unique numeric entity id assigned at creation. */
13
+ readonly eid: number;
14
+ /**
15
+ * Bitmask of component type ids currently attached to this entity. Used by
16
+ * the world for fast archetype matching against query predicates.
17
+ */
18
+ readonly componentBitmask: Bitset;
19
+ /**
20
+ * Free-form property bag. Modules can use it to associate arbitrary data with
21
+ * an entity without registering a dedicated component.
22
+ */
23
+ properties: Map<string, any>;
24
+ constructor(
25
+ /** World that owns this entity. */
26
+ world: World,
27
+ /** Unique numeric entity id assigned at creation. */
28
+ eid: number, ownComponentClass?: ComponentType);
29
+ /**
30
+ * Read-only view of all components currently attached to this entity, keyed
31
+ * by numeric component type id.
32
+ *
33
+ * The mutating methods (`set`, `delete`, `clear`) are not exposed. Use
34
+ * `entity.add`, `entity.attach`, `entity.set`, and `entity.remove` to change
35
+ * the component set.
36
+ *
37
+ * ```ts
38
+ * entity.components.forEach((c) => console.log(c.constructor.name));
39
+ * ```
40
+ */
41
+ get components(): ReadonlyArrayMap<ComponentInstance>;
42
+ /** `true` when no components are currently attached to this entity. */
43
+ get empty(): boolean;
44
+ /**
45
+ * Typed event emitter for entity-level lifecycle events. Currently only the
46
+ * `"destroy"` event is emitted, just before the entity is fully torn down.
47
+ *
48
+ * The emitter is created lazily on first access.
49
+ */
50
+ get events(): EntityEvents;
51
+ /** Metadata for using this entity's eid as a component key. Created lazily for plain entities. */
52
+ get ownMeta(): ComponentMeta;
53
+ /** Number of live component instances currently attached for this entity's component key. */
54
+ instanceCount(): number;
55
+ /** Returns `"EntityN"` where N is the entity id. */
56
+ toString(): string;
57
+ }