@vworlds/vecs 1.0.20 → 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
@@ -0,0 +1,121 @@
1
+ import { _resolveRelationship } from "../dsl.js";
2
+ import { Entity } from "../entity/index.js";
3
+ import { directInjectEids, getInjected, injectArity, mapInject, } from "../inject.js";
4
+ import { Grouping } from "./grouping.js";
5
+ import { registerGroupedQueryPrototype } from "./grouped_query_registry.js";
6
+ import { Query } from "./query.js";
7
+ const EMPTY_GROUPS = new Map();
8
+ /**
9
+ * A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
10
+ * typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
11
+ * the query's usual reactive membership.
12
+ *
13
+ * Instances are created lazily by {@link Query.groupBy} via
14
+ * `Object.setPrototypeOf`, so callers keep the same configured query object.
15
+ *
16
+ * @typeParam K - The grouping key type produced by the key function (or the
17
+ * relationship target entity, for the relationship form).
18
+ * @typeParam R - Component classes guaranteed present on every matched entity.
19
+ */
20
+ export class GroupedQuery extends Query {
21
+ get groupCount() {
22
+ return this._grouping?.groups.size ?? 0;
23
+ }
24
+ /** @internal */
25
+ _enter(e) {
26
+ this._grouping.enter(e);
27
+ super._enter(e);
28
+ }
29
+ /** @internal */
30
+ _exit(e) {
31
+ super._exit(e);
32
+ this._grouping.exit(e);
33
+ }
34
+ /** @internal */
35
+ _initialize(arg0, arg1) {
36
+ if (this._grouping !== undefined) {
37
+ throw new Error(`query '${this.name}' is already grouped`);
38
+ }
39
+ let keyOf;
40
+ let watchEids;
41
+ if (typeof arg1 === "function") {
42
+ const components = arg0;
43
+ const inject = mapInject(this.world, components);
44
+ const arity = injectArity(inject);
45
+ const resolved = new Array(arity);
46
+ keyOf = (e) => {
47
+ getInjected(e, inject, false, resolved);
48
+ return arg1(e, resolved);
49
+ };
50
+ watchEids = directInjectEids(inject);
51
+ this._composeGroupMembership(components);
52
+ }
53
+ else {
54
+ const relEid = _resolveRelationship(arg0, this.world);
55
+ keyOf = (e) => e.parent(relEid);
56
+ watchEids = [relEid];
57
+ this._composeGroupMembership([arg0]);
58
+ }
59
+ for (const ceid of watchEids) {
60
+ this._watchlistBitmask.add(ceid);
61
+ }
62
+ this.track();
63
+ this._grouping = new Grouping(this.world, keyOf, watchEids);
64
+ return this;
65
+ }
66
+ /** @internal */
67
+ _notifyModified(e, ceid, c) {
68
+ super._notifyModified(e, ceid, c);
69
+ // A mutation routed from a silenced source must be invisible to the query,
70
+ // including its group membership: re-keying here would leak the silenced
71
+ // write through `group(...)`. Mirror the base early-return.
72
+ if (this._isSourceSilenced()) {
73
+ return;
74
+ }
75
+ this._grouping.refresh(e, ceid);
76
+ }
77
+ /**
78
+ * @internal A grouped query always reacts to component changes: a watched
79
+ * component changing can re-key an entity into a different group, so the
80
+ * host entity must register it in `_queries` regardless of whether a user
81
+ * `update` callback is present.
82
+ */
83
+ _watchesUpdates() {
84
+ return true;
85
+ }
86
+ destroy() {
87
+ this._grouping?.clear();
88
+ this._grouping = undefined;
89
+ super.destroy();
90
+ }
91
+ group(key) {
92
+ return this._grouping?.get(key);
93
+ }
94
+ groups() {
95
+ return (this._grouping?.groups.values() ?? EMPTY_GROUPS.values());
96
+ }
97
+ groupKeys() {
98
+ return (this._grouping?.keys() ?? EMPTY_GROUPS.keys());
99
+ }
100
+ onGroupEnter(callback) {
101
+ this._assertConfigurable();
102
+ this._grouping?.setOnGroupEnter(callback);
103
+ return this;
104
+ }
105
+ onGroupExit(callback) {
106
+ this._assertConfigurable();
107
+ this._grouping?.setOnGroupExit(callback);
108
+ return this;
109
+ }
110
+ _composeGroupMembership(refs) {
111
+ const componentRefs = refs.filter((ref) => typeof ref === "number" || typeof ref === "function" || ref instanceof Entity);
112
+ if (componentRefs.length === 0) {
113
+ return;
114
+ }
115
+ const existing = this._dsl ?? true;
116
+ this._dsl = { all: [existing, ...componentRefs] };
117
+ this._hasExplicitQuery = true;
118
+ }
119
+ }
120
+ registerGroupedQueryPrototype(GroupedQuery.prototype);
121
+ //# sourceMappingURL=grouped_query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped_query.js","sourceRoot":"","sources":["../../src/query/grouped_query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ type GroupedQueryPrototype = object;
2
+ export declare function getGroupedQueryPrototype(): GroupedQueryPrototype;
3
+ export declare function registerGroupedQueryPrototype(prototype: GroupedQueryPrototype): void;
4
+ export {};
@@ -0,0 +1,11 @@
1
+ let groupedQueryPrototype;
2
+ export function getGroupedQueryPrototype() {
3
+ if (groupedQueryPrototype === undefined) {
4
+ throw new Error("GroupedQuery has not been registered");
5
+ }
6
+ return groupedQueryPrototype;
7
+ }
8
+ export function registerGroupedQueryPrototype(prototype) {
9
+ groupedQueryPrototype = prototype;
10
+ }
11
+ //# sourceMappingURL=grouped_query_registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped_query_registry.js","sourceRoot":"","sources":["../../src/query/grouped_query_registry.ts"],"names":[],"mappings":"AAEA,IAAI,qBAAwD,CAAC;AAE7D,MAAM,UAAU,wBAAwB;IACtC,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,SAAgC;IAC5E,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Entity, type EID } from "../entity/index.js";
2
+ import { type World } from "../world/index.js";
3
+ import { Group } from "./group.js";
4
+ export declare class Grouping {
5
+ readonly groups: Map<unknown, Group<unknown, []>>;
6
+ private readonly _entityKeys;
7
+ private readonly _keyOf;
8
+ private readonly _watchEids;
9
+ private readonly _world;
10
+ private _onGroupEnter;
11
+ private _onGroupExit;
12
+ constructor(world: World, keyOf: (e: Entity) => unknown, watchEids: Iterable<EID>);
13
+ clear(): void;
14
+ enter(e: Entity): void;
15
+ exit(e: Entity): void;
16
+ get(key: unknown): Group | undefined;
17
+ keys(): IterableIterator<unknown>;
18
+ refresh(e: Entity, ceid: EID): void;
19
+ setOnGroupEnter(callback: (group: Group) => void): void;
20
+ setOnGroupExit(callback: (key: unknown, group: Group) => void): void;
21
+ private _addToBucket;
22
+ private _assign;
23
+ private _removeFromBucket;
24
+ }
@@ -1,33 +1,4 @@
1
- import { forEachInjected, } from "../inject.js";
2
- import { Predicate } from "./query.06.predicate.js";
3
- export class Group {
4
- constructor(world, key) {
5
- this._entities = new Set();
6
- this._world = world;
7
- this.key = key;
8
- }
9
- get count() {
10
- return this._entities.size;
11
- }
12
- has(e) {
13
- return this._entities.has(e);
14
- }
15
- [Symbol.iterator]() {
16
- return this._entities[Symbol.iterator]();
17
- }
18
- forEach(arg0, arg1, arg2) {
19
- forEachInjected(this._world, this._entities, arg0, arg1, arg2);
20
- }
21
- /** @internal */
22
- _add(e) {
23
- this._entities.add(e);
24
- }
25
- /** @internal */
26
- _remove(e) {
27
- this._entities.delete(e);
28
- return this._entities.size === 0;
29
- }
30
- }
1
+ import { Group } from "./group.js";
31
2
  export class Grouping {
32
3
  constructor(world, keyOf, watchEids) {
33
4
  this.groups = new Map();
@@ -36,17 +7,9 @@ export class Grouping {
36
7
  this._keyOf = keyOf;
37
8
  this._watchEids = new Set(watchEids);
38
9
  }
39
- get(key) {
40
- return this.groups.get(key);
41
- }
42
- keys() {
43
- return this.groups.keys();
44
- }
45
- setOnGroupEnter(callback) {
46
- this._onGroupEnter = callback;
47
- }
48
- setOnGroupExit(callback) {
49
- this._onGroupExit = callback;
10
+ clear() {
11
+ this.groups.clear();
12
+ this._entityKeys.clear();
50
13
  }
51
14
  enter(e) {
52
15
  this._assign(e, this._keyOf(e));
@@ -58,15 +21,34 @@ export class Grouping {
58
21
  }
59
22
  this._entityKeys.delete(e);
60
23
  }
61
- refresh(e, eid) {
62
- if (!this._watchEids.has(eid)) {
24
+ get(key) {
25
+ return this.groups.get(key);
26
+ }
27
+ keys() {
28
+ return this.groups.keys();
29
+ }
30
+ refresh(e, ceid) {
31
+ if (!this._watchEids.has(ceid)) {
63
32
  return;
64
33
  }
65
34
  this._assign(e, this._keyOf(e));
66
35
  }
67
- clear() {
68
- this.groups.clear();
69
- this._entityKeys.clear();
36
+ setOnGroupEnter(callback) {
37
+ this._onGroupEnter = callback;
38
+ }
39
+ setOnGroupExit(callback) {
40
+ this._onGroupExit = callback;
41
+ }
42
+ _addToBucket(e, key) {
43
+ let group = this.groups.get(key);
44
+ if (group === undefined) {
45
+ group = new Group(this._world, key);
46
+ this.groups.set(key, group);
47
+ group._add(e);
48
+ this._onGroupEnter?.(group);
49
+ return;
50
+ }
51
+ group._add(e);
70
52
  }
71
53
  _assign(e, newKey) {
72
54
  const oldKey = this._entityKeys.get(e);
@@ -83,17 +65,6 @@ export class Grouping {
83
65
  this._addToBucket(e, newKey);
84
66
  this._entityKeys.set(e, newKey);
85
67
  }
86
- _addToBucket(e, key) {
87
- let group = this.groups.get(key);
88
- if (group === undefined) {
89
- group = new Group(this._world, key);
90
- this.groups.set(key, group);
91
- group._add(e);
92
- this._onGroupEnter?.(group);
93
- return;
94
- }
95
- group._add(e);
96
- }
97
68
  _removeFromBucket(e, key) {
98
69
  const group = this.groups.get(key);
99
70
  if (group === undefined) {
@@ -105,6 +76,4 @@ export class Grouping {
105
76
  }
106
77
  }
107
78
  }
108
- export class Groups extends Predicate {
109
- }
110
- //# sourceMappingURL=query.07.groups.js.map
79
+ //# sourceMappingURL=grouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.js","sourceRoot":"","sources":["../../src/query/grouping.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- export { Query, GroupedQuery } from "./query.js";
2
- export { Group, Grouping } from "./query.07.groups.js";
3
- export { _setGroupedQueryCtor, SOURCE_TRACKED_QUERY_ERROR } from "./query.00.base.js";
4
- export type { EntityTestFunc, MaybeRequired, QueryDSL } from "../dsl.js";
5
- export { Iter } from "../inject.js";
6
- export type { DownInject, FanInjectElement, FanInjectTuple, InjectElement, InjectTuple, MaybeResolvedInjectTuple, RequiredResolvedInjectTuple, UpInject, } from "../inject.js";
1
+ import "./grouped_query.js";
2
+ export { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
3
+ export { Group } from "./group.js";
4
+ export { GroupedQuery } from "./grouped_query.js";
5
+ export { Grouping } from "./grouping.js";
6
+ export { Query } from "./query.js";
@@ -1,5 +1,7 @@
1
- export { Query, GroupedQuery } from "./query.js";
2
- export { Group, Grouping } from "./query.07.groups.js";
3
- export { _setGroupedQueryCtor, SOURCE_TRACKED_QUERY_ERROR } from "./query.00.base.js";
4
- export { Iter } from "../inject.js";
1
+ import "./grouped_query.js";
2
+ export { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
3
+ export { Group } from "./group.js";
4
+ export { GroupedQuery } from "./grouped_query.js";
5
+ export { Grouping } from "./grouping.js";
6
+ export { Query } from "./query.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEtF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -1,7 +1,10 @@
1
- import { type ComponentType } from "../component.js";
1
+ import { type ComponentRef, type ComponentType } from "../component.js";
2
+ import { type ExtractSpecsRequired, type QueryDSL, type QuerySpec } from "../dsl.js";
3
+ import { Entity } from "../entity/index.js";
4
+ import { Iter, type FanInjectTuple, type InjectTuple, type MaybeResolvedInjectTuple, type RequiredResolvedInjectTuple } from "../inject.js";
5
+ import { TermConsumer, TermEventKind, type Term } from "../terms/term.js";
2
6
  import { type World } from "../world/index.js";
3
- import { Group } from "./query.07.groups.js";
4
- import { Groups } from "./query.07.groups.js";
7
+ import { type GroupedQuery } from "./grouped_query.js";
5
8
  /**
6
9
  * A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
7
10
  * predicate.
@@ -21,33 +24,60 @@ import { Groups } from "./query.07.groups.js";
21
24
  * you want a reactive entity set without pipeline integration.
22
25
  *
23
26
  * @typeParam R - Component classes guaranteed present on every matched entity
24
- * (declared via {@link requires} or the `_guaranteed` hint of {@link query}).
25
- * Components in `R` appear as non-nullable in {@link sort}, {@link forEach},
27
+ * (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
28
+ * Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
26
29
  * and {@link update} callback tuples.
27
30
  */
28
- export declare class Query<R extends ComponentType[] = []> extends Groups<R> {
31
+ export declare class Query<R extends ComponentType[] = []> implements TermConsumer {
32
+ /** True when membership or watched component data changed since the last reset. */
33
+ changed: boolean;
34
+ /** Entity that stores this query as a component and carries query traits. */
35
+ readonly entity: Entity;
36
+ /** Materialized root term that owns membership for this query. */
37
+ rootTerm: Term | undefined;
29
38
  constructor(name: string, world: World, track?: boolean);
30
- }
31
- /**
32
- * A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
33
- * typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
34
- * the query's usual reactive membership.
35
- *
36
- * `GroupedQuery` lives in the query module alongside `Query`. Instances are
37
- * created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
38
- *
39
- * @typeParam K - The grouping key type produced by the key function (or the
40
- * relationship target entity, for the relationship form).
41
- * @typeParam R - Component classes guaranteed present on every matched entity.
42
- */
43
- export declare class GroupedQuery<K = unknown, R extends ComponentType[] = []> extends Query<R> {
44
- private _grouping;
45
- group(key: K): Group<K, R> | undefined;
46
- groups(): IterableIterator<Group<K, R>>;
47
- groupKeys(): IterableIterator<K>;
48
- get groupCount(): number;
49
- onGroupEnter(callback: (group: Group<K, R>) => void): this;
50
- onGroupExit(callback: (key: K, group: Group<K, R>) => void): this;
51
- private _composeGroupMembership;
39
+ /** `true` once this query has been registered with its world. */
40
+ get built(): boolean;
41
+ /** Unique display name; forwards to the backing entity identity. */
42
+ get name(): string | undefined;
43
+ /** World that owns this query; forwards to the backing entity. */
44
+ get world(): World;
45
+ get count(): number;
46
+ [Symbol.iterator](): IterableIterator<Entity>;
47
+ belongs(e: Entity): boolean;
48
+ has(e: Entity): boolean;
49
+ forEach(callback: (e: Entity) => void): this;
50
+ forEach<J extends FanInjectTuple>(components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
51
+ forEach<J extends FanInjectTuple>(cursor: typeof Entity, components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
52
+ forEach<J extends FanInjectTuple>(cursor: typeof Iter, components: readonly [...J], callback: (it: Iter, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
53
+ toString(): string;
54
+ with<const S extends readonly QuerySpec[]>(...specs: [...S]): Query<[...R, ...ExtractSpecsRequired<S>]>;
55
+ without(dsl: QueryDSL): this;
56
+ track(): this;
57
+ orderBy<J extends InjectTuple>(components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
58
+ orderBy<J extends InjectTuple>(cursor: typeof Entity, components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
59
+ orderBy<J extends InjectTuple>(cursor: typeof Iter, components: readonly [...J], compare: (a: Iter, aResolved: MaybeResolvedInjectTuple<J, R>, b: Iter, bResolved: MaybeResolvedInjectTuple<J, R>) => number): this;
60
+ cascade(rel: ComponentRef): this;
61
+ cascade(rel: ComponentRef, compare: (a: Entity, b: Entity) => number): this;
62
+ groupBy<K, J extends FanInjectTuple>(components: readonly [...J], key: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => K): GroupedQuery<K, R>;
63
+ groupBy(relationship: ComponentRef): GroupedQuery<Entity, R>;
64
+ ignoreSource(source: QueryDSL | Query): this;
65
+ enter<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
66
+ enter<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
67
+ enter<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
68
+ enter(callback: (e: Entity) => void): this;
69
+ exit<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
70
+ exit<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
71
+ exit<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
72
+ exit(callback: (e: Entity) => void): this;
73
+ update<C extends ComponentType>(ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
74
+ update<C extends ComponentType, J extends InjectTuple>(ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
75
+ update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Entity, ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
76
+ update<C extends ComponentType>(cursor: typeof Entity, ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
77
+ update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Iter, ComponentClass: C, inject: readonly [...J], callback: (it: Iter, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
78
+ build(): this;
52
79
  destroy(): void;
80
+ onTermEvent(kind: TermEventKind, entity: Entity): void;
81
+ private _buildSilenceQuery;
82
+ private _reSortCascade;
53
83
  }