@vworlds/vecs 1.0.19 → 1.0.21

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 (145) hide show
  1. package/README.md +51 -48
  2. package/dist/component.d.ts +5 -2
  3. package/dist/component.js +4 -57
  4. package/dist/component.js.map +1 -1
  5. package/dist/component_meta.d.ts +15 -8
  6. package/dist/component_meta.js +6 -4
  7. package/dist/component_meta.js.map +1 -1
  8. package/dist/dsl.d.ts +56 -11
  9. package/dist/dsl.js +21 -31
  10. package/dist/dsl.js.map +1 -1
  11. package/dist/entity/entity.base.d.ts +4 -3
  12. package/dist/entity/entity.base.js +4 -4
  13. package/dist/entity/entity.base.js.map +1 -1
  14. package/dist/entity/entity.components.d.ts +16 -7
  15. package/dist/entity/entity.components.js +48 -23
  16. package/dist/entity/entity.components.js.map +1 -1
  17. package/dist/entity/entity.d.ts +5 -1
  18. package/dist/entity/entity.js +5 -0
  19. package/dist/entity/entity.js.map +1 -1
  20. package/dist/entity/entity.lifecycle.js +25 -25
  21. package/dist/entity/entity.lifecycle.js.map +1 -1
  22. package/dist/entity/entity.queries.js +0 -6
  23. package/dist/entity/entity.queries.js.map +1 -1
  24. package/dist/entity/entity.relationships.d.ts +1 -1
  25. package/dist/entity/entity.relationships.js +7 -5
  26. package/dist/entity/entity.relationships.js.map +1 -1
  27. package/dist/entity/index.d.ts +1 -1
  28. package/dist/entity/index.js.map +1 -1
  29. package/dist/filter.d.ts +6 -6
  30. package/dist/filter.js +2 -1
  31. package/dist/filter.js.map +1 -1
  32. package/dist/index.d.ts +8 -4
  33. package/dist/index.js +5 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/inject.d.ts +18 -17
  36. package/dist/inject.js +34 -34
  37. package/dist/inject.js.map +1 -1
  38. package/dist/module.d.ts +0 -2
  39. package/dist/module.js +0 -3
  40. package/dist/module.js.map +1 -1
  41. package/dist/modules/relationship_types.d.ts +34 -0
  42. package/dist/modules/relationship_types.js +36 -0
  43. package/dist/modules/relationship_types.js.map +1 -0
  44. package/dist/modules/relationships.d.ts +24 -0
  45. package/dist/modules/relationships.js +82 -0
  46. package/dist/modules/relationships.js.map +1 -0
  47. package/dist/modules/singleton.js +1 -2
  48. package/dist/modules/singleton.js.map +1 -1
  49. package/dist/package.json +1 -1
  50. package/dist/query/callbacks.d.ts +17 -0
  51. package/dist/query/callbacks.js +113 -0
  52. package/dist/query/callbacks.js.map +1 -0
  53. package/dist/query/constants.d.ts +1 -0
  54. package/dist/query/constants.js +2 -0
  55. package/dist/query/constants.js.map +1 -0
  56. package/dist/query/{query.03.tracking.d.ts → group.d.ts} +11 -9
  57. package/dist/query/group.js +31 -0
  58. package/dist/query/group.js.map +1 -0
  59. package/dist/query/grouped_query.d.ts +26 -0
  60. package/dist/query/grouped_query.js +121 -0
  61. package/dist/query/grouped_query.js.map +1 -0
  62. package/dist/query/grouped_query_registry.d.ts +4 -0
  63. package/dist/query/grouped_query_registry.js +11 -0
  64. package/dist/query/grouped_query_registry.js.map +1 -0
  65. package/dist/query/grouping.d.ts +24 -0
  66. package/dist/query/{query.07.groups.js → grouping.js} +29 -60
  67. package/dist/query/grouping.js.map +1 -0
  68. package/dist/query/index.d.ts +6 -6
  69. package/dist/query/index.js +6 -4
  70. package/dist/query/index.js.map +1 -1
  71. package/dist/query/query.d.ts +58 -28
  72. package/dist/query/query.js +327 -88
  73. package/dist/query/query.js.map +1 -1
  74. package/dist/system.d.ts +18 -34
  75. package/dist/system.js +33 -49
  76. package/dist/system.js.map +1 -1
  77. package/dist/terms/all_term.d.ts +2 -6
  78. package/dist/terms/all_term.js +2 -7
  79. package/dist/terms/all_term.js.map +1 -1
  80. package/dist/terms/any_term.d.ts +2 -6
  81. package/dist/terms/any_term.js +2 -7
  82. package/dist/terms/any_term.js.map +1 -1
  83. package/dist/terms/build.d.ts +9 -6
  84. package/dist/terms/build.js +17 -14
  85. package/dist/terms/build.js.map +1 -1
  86. package/dist/terms/component_term.d.ts +3 -3
  87. package/dist/terms/component_term.js.map +1 -1
  88. package/dist/terms/composite_build.d.ts +32 -0
  89. package/dist/terms/composite_build.js +28 -0
  90. package/dist/terms/composite_build.js.map +1 -0
  91. package/dist/terms/only_term.d.ts +3 -3
  92. package/dist/terms/only_term.js.map +1 -1
  93. package/dist/terms/predicate_term.d.ts +3 -3
  94. package/dist/terms/predicate_term.js +3 -3
  95. package/dist/terms/predicate_term.js.map +1 -1
  96. package/dist/terms/target_term.d.ts +3 -2
  97. package/dist/terms/target_term.js +11 -17
  98. package/dist/terms/target_term.js.map +1 -1
  99. package/dist/util/dense_set.js +1 -1
  100. package/dist/util/id_pool.d.ts +2 -0
  101. package/dist/util/id_pool.js +10 -0
  102. package/dist/util/id_pool.js.map +1 -1
  103. package/dist/util/ordered_set.js +15 -10
  104. package/dist/util/ordered_set.js.map +1 -1
  105. package/dist/world/world.components.d.ts +5 -4
  106. package/dist/world/world.components.js +16 -16
  107. package/dist/world/world.components.js.map +1 -1
  108. package/dist/world/world.entities.d.ts +2 -2
  109. package/dist/world/world.entities.js.map +1 -1
  110. package/dist/world/world.js +2 -4
  111. package/dist/world/world.js.map +1 -1
  112. package/dist/world/world.modules.d.ts +2 -2
  113. package/dist/world/world.modules.js +6 -1
  114. package/dist/world/world.modules.js.map +1 -1
  115. package/dist/world/world.pools.d.ts +2 -1
  116. package/dist/world/world.pools.js.map +1 -1
  117. package/dist/world/world.queries.d.ts +3 -5
  118. package/dist/world/world.queries.js +11 -8
  119. package/dist/world/world.queries.js.map +1 -1
  120. package/package.json +1 -1
  121. package/dist/query/query.00.base.d.ts +0 -23
  122. package/dist/query/query.00.base.js +0 -77
  123. package/dist/query/query.00.base.js.map +0 -1
  124. package/dist/query/query.01.reactive.d.ts +0 -7
  125. package/dist/query/query.01.reactive.js +0 -58
  126. package/dist/query/query.01.reactive.js.map +0 -1
  127. package/dist/query/query.02.lifecycle.d.ts +0 -6
  128. package/dist/query/query.02.lifecycle.js +0 -63
  129. package/dist/query/query.02.lifecycle.js.map +0 -1
  130. package/dist/query/query.03.tracking.js +0 -31
  131. package/dist/query/query.03.tracking.js.map +0 -1
  132. package/dist/query/query.04.callbacks.d.ts +0 -14
  133. package/dist/query/query.04.callbacks.js +0 -65
  134. package/dist/query/query.04.callbacks.js.map +0 -1
  135. package/dist/query/query.05.updates.d.ts +0 -14
  136. package/dist/query/query.05.updates.js +0 -81
  137. package/dist/query/query.05.updates.js.map +0 -1
  138. package/dist/query/query.06.predicate.d.ts +0 -13
  139. package/dist/query/query.06.predicate.js +0 -40
  140. package/dist/query/query.06.predicate.js.map +0 -1
  141. package/dist/query/query.07.groups.d.ts +0 -41
  142. package/dist/query/query.07.groups.js.map +0 -1
  143. package/dist/relationship.d.ts +0 -19
  144. package/dist/relationship.js +0 -18
  145. package/dist/relationship.js.map +0 -1
@@ -1,9 +1,13 @@
1
- import { _resolveRelationship } from "../dsl.js";
2
- import { Entity } from "../entity/index.js";
3
- import { directInjectEids, getInjected, injectArity, mapInject, } from "../inject.js";
4
- import { _setGroupedQueryCtor } from "./query.00.base.js";
5
- import { Grouping } from "./query.07.groups.js";
6
- import { Groups } from "./query.07.groups.js";
1
+ import { containsDownTerm, isQueryConfig, } from "../dsl.js";
2
+ import { forEachInjected, } from "../inject.js";
3
+ import { SilenceSource, Traversable } from "../modules/relationships.js";
4
+ import { ArrayMap } from "../util/array_map.js";
5
+ import { Bitset } from "../util/bitset.js";
6
+ import { OrderedSet } from "../util/ordered_set.js";
7
+ import { makeEnterCallback, makeExitCallback, makeSortedEntitySet, makeUpdateRegistration, } from "./callbacks.js";
8
+ import { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
9
+ import { getGroupedQueryPrototype } from "./grouped_query_registry.js";
10
+ const EMPTY_ENTITIES = new Set();
7
11
  /**
8
12
  * A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
9
13
  * predicate.
@@ -23,116 +27,351 @@ import { Groups } from "./query.07.groups.js";
23
27
  * you want a reactive entity set without pipeline integration.
24
28
  *
25
29
  * @typeParam R - Component classes guaranteed present on every matched entity
26
- * (declared via {@link requires} or the `_guaranteed` hint of {@link query}).
27
- * Components in `R` appear as non-nullable in {@link sort}, {@link forEach},
30
+ * (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
31
+ * Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
28
32
  * and {@link update} callback tuples.
29
33
  */
30
- export class Query extends Groups {
34
+ export class Query {
31
35
  constructor(name, world, track = true) {
32
- super(name, world, Query, track);
36
+ /** True when membership or watched component data changed since the last reset. */
37
+ this.changed = false;
38
+ /** @internal DSL predicate used to build the root membership term. */
39
+ this._dsl = undefined;
40
+ /** @internal `enter` callback (already wraps any injection logic). */
41
+ this._enterCallback = undefined;
42
+ /** @internal `exit` callback (already wraps any injection logic). */
43
+ this._exitCallback = undefined;
44
+ /** @internal Component eids the exit callback needs snapshotted before component removal. */
45
+ this._exitSnapshotTypes = undefined;
46
+ /** @internal Whether membership APIs are enabled for this query. */
47
+ this._tracking = false;
48
+ /** @internal Bitmask of component eids this query reacts to via `update`. */
49
+ this._watchlistBitmask = new Bitset();
50
+ /** @internal `true` once this query has been registered with its world. */
51
+ this._built = false;
52
+ /** @internal Guards destroy hooks against recursive removal. */
53
+ this._destroyed = false;
54
+ /** @internal `true` once `with` has set an explicit predicate. */
55
+ this._hasExplicitQuery = false;
56
+ /** @internal Per-component-eid `update` callbacks. */
57
+ this._componentUpdateCallbacks = new ArrayMap();
58
+ this._queryComponentClass = Query;
59
+ this.entity = world.entity();
60
+ this.entity.name = name;
61
+ this.entity.attach(Query, this);
62
+ world._addUnbuiltQuery(this);
63
+ if (track) {
64
+ this.track();
65
+ }
66
+ }
67
+ /* -------------------------------------------------------------------------
68
+ * Identity And Membership Views
69
+ * -------------------------------------------------------------------------
70
+ * Read-only accessors over the backing entity and current matched set. These
71
+ * methods do not change query configuration or world registration state.
72
+ */
73
+ /** `true` once this query has been registered with its world. */
74
+ get built() {
75
+ return this._built;
76
+ }
77
+ /** Unique display name; forwards to the backing entity identity. */
78
+ get name() {
79
+ return this.entity.name;
80
+ }
81
+ /** World that owns this query; forwards to the backing entity. */
82
+ get world() {
83
+ return this.entity.world;
84
+ }
85
+ get count() {
86
+ if (!this._tracking) {
87
+ return 0;
88
+ }
89
+ return this._entities?.size ?? this.rootTerm?.count ?? 0;
90
+ }
91
+ [Symbol.iterator]() {
92
+ return this._matchedEntities()[Symbol.iterator]();
93
+ }
94
+ belongs(e) {
95
+ return this.rootTerm?.has(e) ?? false;
96
+ }
97
+ has(e) {
98
+ if (!this._tracking) {
99
+ return false;
100
+ }
101
+ return this._entities?.has(e) ?? this.rootTerm?.has(e) ?? false;
102
+ }
103
+ forEach(arg0, arg1, arg2) {
104
+ this.changed = false;
105
+ this._forEach(arg0, arg1, arg2);
106
+ return this;
107
+ }
108
+ /**
109
+ * @internal Iterate the matched entities with injection, **without**
110
+ * consuming the {@link changed} flag. Used by `System.each`, which runs every
111
+ * tick and must not reset `changed` (that flag tracks whether membership or
112
+ * watched data changed since the caller last read it).
113
+ */
114
+ _forEach(arg0, arg1, arg2) {
115
+ forEachInjected(this.world, this._matchedEntities(), arg0, arg1, arg2);
116
+ }
117
+ toString() {
118
+ return this.name ?? "";
119
+ }
120
+ /* -------------------------------------------------------------------------
121
+ * Predicate And Membership Configuration
122
+ * -------------------------------------------------------------------------
123
+ * Fluent builder methods that decide which entities belong to the query and
124
+ * how that membership is tracked, ordered, grouped, or source-filtered.
125
+ */
126
+ with(...specs) {
127
+ this._assertConfigurable();
128
+ const terms = [];
129
+ let cascade;
130
+ for (const spec of specs) {
131
+ if (isQueryConfig(spec)) {
132
+ terms.push(spec.with);
133
+ if (spec.cascade !== undefined) {
134
+ cascade = spec.cascade;
135
+ }
136
+ }
137
+ else {
138
+ terms.push(spec);
139
+ }
140
+ }
141
+ this._dsl = this._dsl === undefined ? { all: terms } : { all: [this._dsl, ...terms] };
142
+ this._hasExplicitQuery = true;
143
+ if (cascade !== undefined) {
144
+ this.cascade(cascade);
145
+ }
146
+ return this;
147
+ }
148
+ without(dsl) {
149
+ this.with({ not: dsl });
150
+ return this;
151
+ }
152
+ track() {
153
+ this._assertConfigurable();
154
+ this._tracking = true;
155
+ return this;
156
+ }
157
+ orderBy(arg0, arg1, arg2) {
158
+ this._assertConfigurable();
159
+ this._tracking = true;
160
+ this._entities = makeSortedEntitySet(this.world, arg0, arg1, arg2);
161
+ return this;
162
+ }
163
+ cascade(rel, compare) {
164
+ this._assertConfigurable();
165
+ const relEntity = this.world.entity(rel);
166
+ const relMeta = relEntity.meta;
167
+ if (!relMeta.isRelationship) {
168
+ throw new Error(`Component ${relMeta.Class.name} is not a Relationship`);
169
+ }
170
+ const traversable = relEntity.get(Traversable);
171
+ if (!traversable) {
172
+ throw new Error(`Relationship ${relMeta.Class.name} does not have the Traversable trait`);
173
+ }
174
+ const depths = traversable.depths;
175
+ this.orderBy([], (a, _ra, b) => {
176
+ const da = depths.get(a) ?? -1;
177
+ const db = depths.get(b) ?? -1;
178
+ return da - db || compare?.(a, b) || 0;
179
+ });
180
+ this.update(relMeta.Class, (entity) => {
181
+ this._reSortCascade(entity, relMeta.eid);
182
+ });
183
+ return this;
184
+ }
185
+ groupBy(arg0, arg1) {
186
+ this._assertConfigurable();
187
+ Object.setPrototypeOf(this, getGroupedQueryPrototype());
188
+ return this._initialize(arg0, arg1);
189
+ }
190
+ ignoreSource(source) {
191
+ this._assertConfigurable();
192
+ const query = typeof source === "object" && !Array.isArray(source) && "entity" in source
193
+ ? source
194
+ : this._buildSilenceQuery(source);
195
+ this.entity.set(SilenceSource, { target: query.entity });
196
+ this._silenceQuery = query;
197
+ return this;
198
+ }
199
+ enter(arg0, arg1, arg2) {
200
+ this._assertConfigurable();
201
+ this._enterCallback = makeEnterCallback(this.world, arg0, arg1, arg2);
202
+ return this;
203
+ }
204
+ exit(arg0, arg1, arg2) {
205
+ this._assertConfigurable();
206
+ const exit = makeExitCallback(this.world, arg0, arg1, arg2);
207
+ this._exitCallback = exit.callback;
208
+ this._exitSnapshotTypes = exit.snapshotTypes;
209
+ return this;
210
+ }
211
+ update(arg0, arg1, arg2, arg3) {
212
+ this._assertConfigurable();
213
+ const { componentEid, callback } = makeUpdateRegistration(this.world, arg0, arg1, arg2, arg3);
214
+ this._componentUpdateCallbacks.set(componentEid, callback);
215
+ this._watchlistBitmask.add(componentEid);
216
+ if (!this._hasExplicitQuery) {
217
+ this._dsl = this._watchlistBitmask.indices();
218
+ }
219
+ return this;
220
+ }
221
+ /* -------------------------------------------------------------------------
222
+ * World Registration And Routing Hooks
223
+ * -------------------------------------------------------------------------
224
+ * Public internals called by World, terms, and System subclasses to register,
225
+ * destroy, and route membership/update events through the query.
226
+ */
227
+ build() {
228
+ if (this.built) {
229
+ return this;
230
+ }
231
+ if (this.world.deferred) {
232
+ this.world._addUnbuiltQuery(this);
233
+ return this;
234
+ }
235
+ return this._build();
33
236
  }
34
- }
35
- const EMPTY_GROUPS = new Map();
36
- /**
37
- * A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
38
- * typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
39
- * the query's usual reactive membership.
40
- *
41
- * `GroupedQuery` lives in the query module alongside `Query`. Instances are
42
- * created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
43
- *
44
- * @typeParam K - The grouping key type produced by the key function (or the
45
- * relationship target entity, for the relationship form).
46
- * @typeParam R - Component classes guaranteed present on every matched entity.
47
- */
48
- export class GroupedQuery extends Query {
49
237
  /** @internal */
50
- _initialize(arg0, arg1) {
51
- if (this._grouping !== undefined) {
52
- throw `query '${this.name}' is already grouped`;
53
- }
54
- let keyOf;
55
- let watchEids;
56
- if (typeof arg1 === "function") {
57
- const components = arg0;
58
- const inject = mapInject(this.world, components);
59
- const arity = injectArity(inject);
60
- const resolved = new Array(arity);
61
- keyOf = (e) => {
62
- getInjected(e, inject, false, resolved);
63
- return arg1(e, resolved);
64
- };
65
- watchEids = directInjectEids(inject);
66
- this._composeGroupMembership(components);
238
+ _build() {
239
+ if (this.built) {
240
+ return this;
67
241
  }
68
- else {
69
- const relEid = _resolveRelationship(arg0, this.world);
70
- keyOf = (e) => e.parent(relEid);
71
- watchEids = [relEid];
72
- this._composeGroupMembership([arg0]);
242
+ if (!this._isBuildable()) {
243
+ this.destroy();
244
+ return this;
73
245
  }
74
- for (const eid of watchEids) {
75
- this._watchlistBitmask.add(eid);
246
+ this.world._removeUnbuiltQuery(this);
247
+ if (this._dsl !== undefined) {
248
+ if (this._tracking && containsDownTerm(this._dsl)) {
249
+ this.destroy();
250
+ throw new Error(SOURCE_TRACKED_QUERY_ERROR);
251
+ }
252
+ this.rootTerm = this.world.getTerm(this._dsl);
253
+ this._unsubscribeTerm = this.rootTerm.subscribe(this);
76
254
  }
77
- this.track();
78
- this._grouping = new Grouping(this.world, keyOf, watchEids);
255
+ this.world._addQuery(this);
256
+ this._built = true;
257
+ this._backfill();
79
258
  return this;
80
259
  }
81
260
  /** @internal */
261
+ _clearSilence() {
262
+ this._silenceQuery = undefined;
263
+ }
264
+ destroy() {
265
+ if (this._destroyed) {
266
+ return;
267
+ }
268
+ this._destroyed = true;
269
+ this.world._removeQuery(this);
270
+ this._entities?.clear();
271
+ this._entities = undefined;
272
+ this._tracking = false;
273
+ if (!this.entity._destroyed && this.entity.get(this._queryComponentClass) !== undefined) {
274
+ this.entity.destroy();
275
+ }
276
+ }
277
+ /** @internal */
82
278
  _enter(e) {
83
- this._grouping.enter(e);
84
- super._enter(e);
279
+ this.changed = true;
280
+ this._entities?.add(e);
281
+ e._addQueryMembership(this);
282
+ this._enterCallback?.(e);
283
+ e.components.forEach((c, ceid) => {
284
+ if (!this._watchlistBitmask.has(ceid)) {
285
+ return;
286
+ }
287
+ this._notifyModified(e, ceid, c);
288
+ });
85
289
  }
86
290
  /** @internal */
87
291
  _exit(e) {
88
- super._exit(e);
89
- this._grouping.exit(e);
292
+ this.changed = true;
293
+ this._exitCallback?.(e);
294
+ this._entities?.delete(e);
295
+ e._removeQueryMembership(this);
90
296
  }
91
297
  /** @internal */
92
- _notifyModified(e, meta, c) {
93
- super._notifyModified(e, meta, c);
94
- this._grouping.refresh(e, meta.eid);
298
+ _notifyModified(e, ceid, c) {
299
+ if (!this._watchlistBitmask.has(ceid)) {
300
+ return;
301
+ }
302
+ if (this._isSourceSilenced()) {
303
+ return;
304
+ }
305
+ this.changed = true;
306
+ const callback = this._componentUpdateCallbacks.get(ceid);
307
+ if (callback) {
308
+ callback(e, c);
309
+ }
310
+ }
311
+ onTermEvent(kind, entity) {
312
+ if (kind === 0 /* TermEventKind.Enter */) {
313
+ this._enter(entity);
314
+ }
315
+ else {
316
+ this._exit(entity);
317
+ }
318
+ }
319
+ /** @internal */
320
+ _unsubscribeRootTerm() {
321
+ this._unsubscribeTerm?.();
322
+ this._unsubscribeTerm = undefined;
323
+ this.rootTerm = undefined;
95
324
  }
96
325
  /** @internal */
97
326
  _watchesUpdates() {
98
- return super._watchesUpdates() || true;
327
+ return this._componentUpdateCallbacks.size > 0;
99
328
  }
100
- group(key) {
101
- return this._grouping?.get(key);
329
+ /** @internal Throw when a builder method is called after registration. */
330
+ _assertConfigurable() {
331
+ if (this.built) {
332
+ throw new Error(`query '${this.name}' has already been built`);
333
+ }
102
334
  }
103
- groups() {
104
- return (this._grouping?.groups.values() ?? EMPTY_GROUPS.values());
335
+ /** @internal */
336
+ _backfill() {
337
+ if (!this._tracking || !this.rootTerm) {
338
+ return;
339
+ }
340
+ this.world.defer(() => {
341
+ for (const e of this.rootTerm ?? EMPTY_ENTITIES) {
342
+ this._enter(e);
343
+ }
344
+ });
105
345
  }
106
- groupKeys() {
107
- return (this._grouping?.keys() ?? EMPTY_GROUPS.keys());
346
+ /** @internal Whether this object has enough configuration to enter the world. */
347
+ _isBuildable() {
348
+ return this._dsl !== undefined;
108
349
  }
109
- get groupCount() {
110
- return this._grouping?.groups.size ?? 0;
350
+ /** @internal */
351
+ _isSourceSilenced() {
352
+ const source = this.entity.world._routingSource;
353
+ return source !== undefined && this._silenceQuery?.has(source) === true;
111
354
  }
112
- onGroupEnter(callback) {
113
- this._assertConfigurable();
114
- this._grouping?.setOnGroupEnter(callback);
115
- return this;
355
+ /** @internal */
356
+ _matchedEntities() {
357
+ if (!this._tracking) {
358
+ return EMPTY_ENTITIES;
359
+ }
360
+ return this._entities ?? this.rootTerm ?? EMPTY_ENTITIES;
116
361
  }
117
- onGroupExit(callback) {
118
- this._assertConfigurable();
119
- this._grouping?.setOnGroupExit(callback);
120
- return this;
362
+ _buildSilenceQuery(dsl) {
363
+ const q = this.world.query(`${this.name}:silence`).with(dsl);
364
+ q.entity.childOf(this.entity);
365
+ return q;
121
366
  }
122
- _composeGroupMembership(refs) {
123
- const componentRefs = refs.filter((ref) => typeof ref === "number" || typeof ref === "function" || ref instanceof Entity);
124
- if (componentRefs.length === 0) {
125
- return;
367
+ _reSortCascade(entity, relEid) {
368
+ const entities = this._entities;
369
+ if (entities instanceof OrderedSet) {
370
+ entities.reSort(entity);
371
+ }
372
+ for (const child of entity._childrenByEid(relEid) ?? []) {
373
+ this._reSortCascade(child, relEid);
126
374
  }
127
- const existing = this._dsl ?? true;
128
- this._dsl = { all: [existing, ...componentRefs] };
129
- this._hasExplicitQuery = true;
130
- }
131
- destroy() {
132
- this._grouping?.clear();
133
- this._grouping = undefined;
134
- super.destroy();
135
375
  }
136
376
  }
137
- _setGroupedQueryCtor(GroupedQuery);
138
377
  //# sourceMappingURL=query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,aAAa,GAId,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,eAAe,GAQhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAGvE,MAAM,cAAc,GAAwB,IAAI,GAAG,EAAE,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,KAAK;IAqChB,YAAY,IAAY,EAAE,KAAY,EAAE,QAAiB,IAAI;QApC7D,mFAAmF;QAC5E,YAAO,GAAG,KAAK,CAAC;QACvB,sEAAsE;QAC/D,SAAI,GAAyB,SAAS,CAAC;QAG9C,sEAAsE;QAC/D,mBAAc,GAA+B,SAAS,CAAC;QAC9D,qEAAqE;QAC9D,kBAAa,GAA+B,SAAS,CAAC;QAC7D,6FAA6F;QACtF,uBAAkB,GAAsB,SAAS,CAAC;QAKzD,oEAAoE;QAC7D,cAAS,GAAG,KAAK,CAAC;QACzB,6EAA6E;QACtE,sBAAiB,GAAW,IAAI,MAAM,EAAE,CAAC;QAEhD,2EAA2E;QACjE,WAAM,GAAG,KAAK,CAAC;QACzB,gEAAgE;QACtD,eAAU,GAAG,KAAK,CAAC;QAG7B,kEAAkE;QACxD,sBAAiB,GAAY,KAAK,CAAC;QAC7C,sDAAsD;QAC5C,8BAAyB,GAAG,IAAI,QAAQ,EAAqB,CAAC;QAOtE,IAAI,CAAC,oBAAoB,GAAG,KAAsB,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAsB,EAAE,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,gBAAgB,CAAC,IAAW,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IAEH,iEAAiE;IACjE,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,oEAAoE;IACpE,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,kEAAkE;IAClE,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,KAAK;QACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;IAC3D,CAAC;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtB,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpD,CAAC;IAEM,OAAO,CAAC,CAAS;QACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACxC,CAAC;IAEM,GAAG,CAAC,CAAS;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAClE,CAAC;IAiBM,OAAO,CAAC,IAAa,EAAE,IAAc,EAAE,IAAc;QAC1D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACO,QAAQ,CAAC,IAAa,EAAE,IAAc,EAAE,IAAc;QAC9D,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IAEI,IAAI,CACT,GAAG,KAAa;QAEhB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,IAAI,OAAiC,CAAC;QAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAA6B,CAAC;IACvC,CAAC;IAEM,OAAO,CAAC,GAAa;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IA+BM,OAAO,CACZ,IAA4D,EAC5D,IAA0C,EAC1C,IAAe;QAEf,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAIM,OAAO,CAAC,GAAiB,EAAE,OAA0C;QAC1E,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,CAAC,IAAI,sCAAsC,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,OAAO,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;YACpC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAOM,OAAO,CACZ,IAAgD,EAChD,IAAwC;QAExC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACxD,OAAQ,IAAY,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEM,YAAY,CAAC,MAAwB;QAC1C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,KAAK,GACT,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,IAAI,MAAM;YACxE,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAwBM,KAAK,CACV,IAAuE,EACvE,IAA6B,EAC7B,IAAe;QAEf,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAiBM,IAAI,CACT,IAA2E,EAC3E,IAAmD,EACnD,IAA+B;QAE/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IA4BM,MAAM,CACX,IAAqC,EACrC,IAA+D,EAC/D,IAA4D,EAC5D,IAA+B;QAE/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9F,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IAEI,KAAK;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAW,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,gBAAgB;IACT,MAAM;QACX,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAW,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAW,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IACT,aAAa;QAClB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAW,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,SAAS,EAAE,CAAC;YACxF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,CAAS;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,mBAAmB,CAAC,IAAW,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,CAAS;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,sBAAsB,CAAC,IAAW,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB;IACT,eAAe,CAAC,CAAS,EAAE,IAAS,EAAE,CAAoB;QAC/D,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAEM,WAAW,CAAC,IAAmB,EAAE,MAAc;QACpD,IAAI,IAAI,gCAAwB,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,gBAAgB;IACT,oBAAoB;QACzB,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,gBAAgB;IACT,eAAe;QACpB,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,0EAA0E;IAChE,mBAAmB;QAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,gBAAgB;IACN,SAAS;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,cAAc,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iFAAiF;IACvE,YAAY;QACpB,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;IACjC,CAAC;IAED,gBAAgB;IACN,iBAAiB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QAChD,OAAO,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC1E,CAAC;IAED,gBAAgB;IACN,gBAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IAC3D,CAAC;IAEO,kBAAkB,CAAC,GAAa;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,MAAW;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,QAAQ,YAAY,UAAU,EAAE,CAAC;YACnC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF"}
package/dist/system.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type ComponentType } from "./component.js";
2
2
  import { Iter, type FanInjectTuple, type MaybeResolvedInjectTuple } from "./inject.js";
3
3
  import { Query } from "./query/index.js";
4
- import { type QueryDSL } from "./dsl.js";
4
+ import { type ExtractSpecsRequired, type QuerySpec } from "./dsl.js";
5
5
  import { Entity } from "./entity/index.js";
6
6
  import { type IPhase } from "./phase.js";
7
7
  import { type World } from "./world/index.js";
@@ -15,7 +15,7 @@ type RunCallback = (now: number, delta: number) => void;
15
15
  *
16
16
  * ```ts
17
17
  * world.system("Move")
18
- * .requires(Position, Velocity) // track entities with both components
18
+ * .with(Position, Velocity) // track entities with both components
19
19
  * .phase("update")
20
20
  * .enter([Position], (e, [pos]) => { pos.x = 0; })
21
21
  * .update(Position, (e, pos) => { pos.x += pos.vx; })
@@ -33,12 +33,12 @@ type RunCallback = (now: number, delta: number) => void;
33
33
  *
34
34
  * ### Component injection and type inference
35
35
  *
36
- * `enter`, `exit`, `update`, `each`, and `sort` accept an array of component
36
+ * `enter`, `exit`, `update`, `each`, and `orderBy` accept an array of component
37
37
  * classes resolved from the entity and passed as a typed tuple to the
38
38
  * callback.
39
39
  *
40
- * Components declared via {@link requires} (or the `_guaranteed` argument of
41
- * {@link query}) are tracked as the type parameter `R`. Inside `sort`,
40
+ * Components declared via {@link with} (or the `hint` field of a
41
+ * {@link QueryConfig}) are tracked as the type parameter `R`. Inside `orderBy`,
42
42
  * `each`, and `update` injection callbacks they are non-nullable; any other
43
43
  * component remains `Type | undefined`.
44
44
  *
@@ -146,11 +146,11 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
146
146
  *
147
147
  * Unlike {@link update} (which only fires when `entity.modified(C)` is
148
148
  * called), `each` fires every tick the system runs, once per tracked entity.
149
- * Components declared via {@link requires} are non-nullable in the resolved
149
+ * Components declared via {@link with} are non-nullable in the resolved
150
150
  * tuple; any other component class may be `undefined` if the entity lacks it.
151
151
  *
152
152
  * `each` does **not** modify the system's query — define membership with
153
- * {@link requires} or {@link query} as usual. It does, however, implicitly
153
+ * {@link with} as usual. It does, however, implicitly
154
154
  * enable {@link track}, so matched entities are exposed via {@link count},
155
155
  * {@link has}, iteration, and {@link forEach}.
156
156
  *
@@ -163,14 +163,14 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
163
163
  *
164
164
  * @param components - Component classes to resolve from each entity.
165
165
  * @param callback - Receives the entity and a tuple of resolved component
166
- * instances (`undefined` for any not covered by {@link requires}).
166
+ * instances (`undefined` for any not covered by {@link with}).
167
167
  * @returns This system, for chaining.
168
168
  * @throws When `each` has already been registered on this system.
169
169
  *
170
170
  * @example
171
171
  * ```ts
172
172
  * world.system("Move")
173
- * .requires(Position, Velocity)
173
+ * .with(Position, Velocity)
174
174
  * .each([Position, Velocity], (e, [pos, vel]) => {
175
175
  * pos.x += vel.vx;
176
176
  * pos.y += vel.vy;
@@ -188,37 +188,21 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
188
188
  * cursor instead of the bare entity. The cursor exposes the visited entity
189
189
  * (`it.entity`) and, in `it.src`, the source entity each resolved component
190
190
  * was read from (the visited entity for direct components, the relationship
191
- * target for `up`-injected ones).
191
+ * target for `target`-injected ones).
192
192
  */
193
193
  each<J extends FanInjectTuple>(cursor: typeof Iter, components: readonly [...J], callback: (it: Iter, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
194
194
  /**
195
- * Set the entity-membership predicate using a {@link QueryDSL} expression.
195
+ * Add entity-membership predicates using {@link QuerySpec} expressions.
196
196
  *
197
- * Replaces any implicit query derived from `update` watchlists and any
198
- * previous `requires` call. After calling `query`, watchlist auto-expansion
199
- * via `update` is disabled.
197
+ * Merges with any existing predicate using `all`. After calling `with`,
198
+ * watchlist auto-expansion via `update` is disabled.
200
199
  *
201
- * The optional `_guaranteed` tuple is a pure type-level hint — see
202
- * {@link Query.query} for details.
200
+ * `hint` fields are pure type-level hints — see {@link Query.with} for details.
203
201
  *
204
- * @param q - Query expression.
205
- * @param _guaranteed - Component classes guaranteed present on every matched
206
- * entity (type hint only — not validated at runtime).
207
- * @returns This system, retyped with the guaranteed tuple as its `R`.
202
+ * @param specs - Query specifications to add.
203
+ * @returns This system, retyped with the guaranteed components added to `R`.
208
204
  */
209
- query<T extends ComponentType[] = []>(q: QueryDSL, _guaranteed?: readonly [...T]): System<T>;
210
- /**
211
- * Shorthand for `query([...components])` — tracks entities that have **all**
212
- * of the listed component types.
213
- *
214
- * Equivalent to `query(components)`. The listed components are also
215
- * recorded in the type parameter `R`, so {@link sort}, {@link each}, and
216
- * {@link update} callbacks treat them as non-nullable.
217
- *
218
- * @param components - Component classes to require.
219
- * @returns This system, retyped with the required tuple as its `R`.
220
- */
221
- requires<T extends ComponentType[]>(...components: [...T]): System<T>;
205
+ with<const S extends readonly QuerySpec[]>(...specs: [...S]): System<[...R, ...ExtractSpecsRequired<S>]>;
222
206
  /**
223
207
  * Systems cannot use groupBy. Use `world.query(...).groupBy(...)` instead.
224
208
  */
@@ -244,7 +228,7 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
244
228
  *
245
229
  * @example
246
230
  * ```ts
247
- * const sys = world.system("AI").requires(Enemy).run(runAI);
231
+ * const sys = world.system("AI").with(Enemy).run(runAI);
248
232
  * // Pause AI processing during a cutscene:
249
233
  * sys.disable();
250
234
  * // Resume: