@vworlds/vecs 1.0.14 → 1.0.16
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.
- package/README.md +249 -119
- package/dist/component.d.ts +52 -76
- package/dist/component.js +60 -45
- package/dist/component.js.map +1 -1
- package/dist/component_meta.d.ts +98 -0
- package/dist/component_meta.js +65 -0
- package/dist/component_meta.js.map +1 -0
- package/dist/dsl.d.ts +46 -34
- package/dist/dsl.js +459 -61
- package/dist/dsl.js.map +1 -1
- package/dist/entity/entity.base.d.ts +57 -0
- package/dist/entity/entity.base.js +81 -0
- package/dist/entity/entity.base.js.map +1 -0
- package/dist/entity/entity.components.d.ts +117 -0
- package/dist/entity/entity.components.js +244 -0
- package/dist/entity/entity.components.js.map +1 -0
- package/dist/entity/entity.d.ts +35 -0
- package/dist/entity/entity.identity.d.ts +8 -0
- package/dist/entity/entity.identity.js +15 -0
- package/dist/entity/entity.identity.js.map +1 -0
- package/dist/entity/entity.js +33 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/entity.lifecycle.d.ts +12 -0
- package/dist/entity/entity.lifecycle.js +111 -0
- package/dist/entity/entity.lifecycle.js.map +1 -0
- package/dist/entity/entity.queries.d.ts +3 -0
- package/dist/entity/entity.queries.js +33 -0
- package/dist/entity/entity.queries.js.map +1 -0
- package/dist/entity/entity.relationships.d.ts +9 -0
- package/dist/entity/entity.relationships.js +74 -0
- package/dist/entity/entity.relationships.js.map +1 -0
- package/dist/entity/index.d.ts +2 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/filter.d.ts +27 -8
- package/dist/filter.js +33 -18
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +13 -5
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +80 -0
- package/dist/inject.js +270 -0
- package/dist/inject.js.map +1 -0
- package/dist/module.d.ts +23 -0
- package/dist/module.js +17 -0
- package/dist/module.js.map +1 -0
- package/dist/modules/identity.d.ts +15 -0
- package/dist/modules/identity.js +41 -0
- package/dist/modules/identity.js.map +1 -0
- package/dist/modules/singleton.d.ts +26 -0
- package/dist/modules/singleton.js +41 -0
- package/dist/modules/singleton.js.map +1 -0
- package/dist/package.json +18 -20
- package/dist/phase.d.ts +2 -2
- package/dist/query/index.d.ts +6 -0
- package/dist/query/index.js +5 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/query.00.base.d.ts +23 -0
- package/dist/query/query.00.base.js +77 -0
- package/dist/query/query.00.base.js.map +1 -0
- package/dist/query/query.01.reactive.d.ts +7 -0
- package/dist/query/query.01.reactive.js +58 -0
- package/dist/query/query.01.reactive.js.map +1 -0
- package/dist/query/query.02.lifecycle.d.ts +6 -0
- package/dist/query/query.02.lifecycle.js +63 -0
- package/dist/query/query.02.lifecycle.js.map +1 -0
- package/dist/query/query.03.tracking.d.ts +15 -0
- package/dist/query/query.03.tracking.js +31 -0
- package/dist/query/query.03.tracking.js.map +1 -0
- package/dist/query/query.04.callbacks.d.ts +14 -0
- package/dist/query/query.04.callbacks.js +65 -0
- package/dist/query/query.04.callbacks.js.map +1 -0
- package/dist/query/query.05.updates.d.ts +14 -0
- package/dist/query/query.05.updates.js +81 -0
- package/dist/query/query.05.updates.js.map +1 -0
- package/dist/query/query.06.predicate.d.ts +13 -0
- package/dist/query/query.06.predicate.js +40 -0
- package/dist/query/query.06.predicate.js.map +1 -0
- package/dist/query/query.07.groups.d.ts +41 -0
- package/dist/query/query.07.groups.js +110 -0
- package/dist/query/query.07.groups.js.map +1 -0
- package/dist/query/query.d.ts +53 -0
- package/dist/query/query.js +138 -0
- package/dist/query/query.js.map +1 -0
- package/dist/relationship.d.ts +19 -0
- package/dist/relationship.js +18 -0
- package/dist/relationship.js.map +1 -0
- package/dist/system.d.ts +37 -23
- package/dist/system.js +80 -64
- package/dist/system.js.map +1 -1
- package/dist/terms/all_term.d.ts +32 -0
- package/dist/terms/all_term.js +41 -0
- package/dist/terms/all_term.js.map +1 -0
- package/dist/terms/any_term.d.ts +33 -0
- package/dist/terms/any_term.js +42 -0
- package/dist/terms/any_term.js.map +1 -0
- package/dist/terms/build.d.ts +62 -0
- package/dist/terms/build.js +382 -0
- package/dist/terms/build.js.map +1 -0
- package/dist/terms/component_term.d.ts +37 -0
- package/dist/terms/component_term.js +49 -0
- package/dist/terms/component_term.js.map +1 -0
- package/dist/terms/empty_term.d.ts +6 -0
- package/dist/terms/empty_term.js +12 -0
- package/dist/terms/empty_term.js.map +1 -0
- package/dist/terms/index.d.ts +11 -0
- package/dist/terms/index.js +12 -0
- package/dist/terms/index.js.map +1 -0
- package/dist/terms/not_term.d.ts +35 -0
- package/dist/terms/not_term.js +47 -0
- package/dist/terms/not_term.js.map +1 -0
- package/dist/terms/only_term.d.ts +47 -0
- package/dist/terms/only_term.js +79 -0
- package/dist/terms/only_term.js.map +1 -0
- package/dist/terms/predicate_term.d.ts +80 -0
- package/dist/terms/predicate_term.js +109 -0
- package/dist/terms/predicate_term.js.map +1 -0
- package/dist/terms/target_term.d.ts +43 -0
- package/dist/terms/target_term.js +87 -0
- package/dist/terms/target_term.js.map +1 -0
- package/dist/terms/term.d.ts +94 -0
- package/dist/terms/term.js +202 -0
- package/dist/terms/term.js.map +1 -0
- package/dist/terms/world_term.d.ts +68 -0
- package/dist/terms/world_term.js +99 -0
- package/dist/terms/world_term.js.map +1 -0
- package/dist/timer.js +2 -2
- package/dist/timer.js.map +1 -1
- package/dist/util/array_map.js +12 -0
- package/dist/util/array_map.js.map +1 -1
- package/dist/util/bitset.js +107 -22
- package/dist/util/bitset.js.map +1 -1
- package/dist/util/dense_set.d.ts +1 -0
- package/dist/util/dense_set.js +90 -0
- package/dist/util/dense_set.js.map +1 -0
- package/dist/util/id_pool.d.ts +23 -0
- package/dist/util/id_pool.js +194 -0
- package/dist/util/id_pool.js.map +1 -0
- package/dist/util/ordered_set.js.map +1 -1
- package/dist/world/index.d.ts +3 -0
- package/dist/world/index.js +3 -0
- package/dist/world/index.js.map +1 -0
- package/dist/world/world.base.d.ts +6 -0
- package/dist/world/world.base.js +21 -0
- package/dist/world/world.base.js.map +1 -0
- package/dist/world/world.components.d.ts +67 -0
- package/dist/world/world.components.js +93 -0
- package/dist/world/world.components.js.map +1 -0
- package/dist/world/world.d.ts +29 -0
- package/dist/world/world.deferred.d.ts +13 -0
- package/dist/world/world.deferred.js +93 -0
- package/dist/world/world.deferred.js.map +1 -0
- package/dist/world/world.entities.d.ts +18 -0
- package/dist/world/world.entities.js +97 -0
- package/dist/world/world.entities.js.map +1 -0
- package/dist/world/world.js +39 -0
- package/dist/world/world.js.map +1 -0
- package/dist/world/world.modules.d.ts +12 -0
- package/dist/world/world.modules.js +21 -0
- package/dist/world/world.modules.js.map +1 -0
- package/dist/world/world.pipeline.d.ts +21 -0
- package/dist/world/world.pipeline.js +105 -0
- package/dist/world/world.pipeline.js.map +1 -0
- package/dist/world/world.pools.d.ts +9 -0
- package/dist/world/world.pools.js +59 -0
- package/dist/world/world.pools.js.map +1 -0
- package/dist/world/world.queries.d.ts +18 -0
- package/dist/world/world.queries.js +101 -0
- package/dist/world/world.queries.js.map +1 -0
- package/dist/world/world.storage.d.ts +7 -0
- package/dist/world/world.storage.js +26 -0
- package/dist/world/world.storage.js.map +1 -0
- package/package.json +18 -20
- package/tsconfig.build.json +13 -0
- package/.husky/pre-commit +0 -3
- package/.prettierrc +0 -7
- package/dist/entity.d.ts +0 -215
- package/dist/entity.js +0 -457
- package/dist/entity.js.map +0 -1
- package/dist/query.d.ts +0 -251
- package/dist/query.js +0 -353
- package/dist/query.js.map +0 -1
- package/dist/world.d.ts +0 -389
- package/dist/world.js +0 -631
- package/dist/world.js.map +0 -1
- package/eslint-rules/internal-underscore.js +0 -60
- package/eslint.config.js +0 -22
package/dist/inject.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { Entity } from "./entity/index.js";
|
|
2
|
+
import { _resolveRelationship } from "./dsl.js";
|
|
3
|
+
function _isUpInject(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && "up" in value;
|
|
5
|
+
}
|
|
6
|
+
function _isDownInject(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && "down" in value;
|
|
8
|
+
}
|
|
9
|
+
export function mapInject(world, inject) {
|
|
10
|
+
return inject.map((term) => {
|
|
11
|
+
if (_isUpInject(term)) {
|
|
12
|
+
return {
|
|
13
|
+
up: [_resolveRelationship(term.up[0], world), term.up[1].map((C) => world.entity(C).eid)],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (_isDownInject(term)) {
|
|
17
|
+
return {
|
|
18
|
+
down: [
|
|
19
|
+
_resolveRelationship(term.down[0], world),
|
|
20
|
+
term.down[1].map((C) => world.entity(C).eid),
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return world.entity(term).eid;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function injectArity(inject) {
|
|
28
|
+
let arity = 0;
|
|
29
|
+
inject.forEach((term) => {
|
|
30
|
+
arity += typeof term === "number" ? 1 : "up" in term ? term.up[1].length : term.down[1].length;
|
|
31
|
+
});
|
|
32
|
+
return arity;
|
|
33
|
+
}
|
|
34
|
+
export function getInjected(e, inject, requireDirectComponents, out, exitSnapshot) {
|
|
35
|
+
let outIndex = 0;
|
|
36
|
+
inject.forEach((term) => {
|
|
37
|
+
if (typeof term === "number") {
|
|
38
|
+
const c = exitSnapshot?.get(term) ?? e._get(term);
|
|
39
|
+
if (requireDirectComponents && !c) {
|
|
40
|
+
throw new Error("query does not contain component");
|
|
41
|
+
}
|
|
42
|
+
out[outIndex++] = c;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if ("down" in term) {
|
|
46
|
+
throw new Error("down injection is only supported in each/forEach");
|
|
47
|
+
}
|
|
48
|
+
const target = e.componentBitmask.has(term.up[0])
|
|
49
|
+
? e._get(term.up[0])?.target
|
|
50
|
+
: undefined;
|
|
51
|
+
term.up[1].forEach((componentEid) => {
|
|
52
|
+
out[outIndex++] = target?.componentBitmask.has(componentEid)
|
|
53
|
+
? target._get(componentEid)
|
|
54
|
+
: undefined;
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export function getInjectedWithSrc(e, inject, out, src, requireDirectComponents = false, exitSnapshot) {
|
|
59
|
+
let outIndex = 0;
|
|
60
|
+
inject.forEach((term) => {
|
|
61
|
+
if (typeof term === "number") {
|
|
62
|
+
const c = exitSnapshot?.get(term) ?? e._get(term);
|
|
63
|
+
if (requireDirectComponents && !c) {
|
|
64
|
+
throw new Error("query does not contain component");
|
|
65
|
+
}
|
|
66
|
+
out[outIndex] = c;
|
|
67
|
+
src[outIndex] = e;
|
|
68
|
+
outIndex++;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if ("down" in term) {
|
|
72
|
+
throw new Error("down injection is only supported in each/forEach");
|
|
73
|
+
}
|
|
74
|
+
const target = e.componentBitmask.has(term.up[0])
|
|
75
|
+
? e._get(term.up[0])?.target
|
|
76
|
+
: undefined;
|
|
77
|
+
term.up[1].forEach((componentEid) => {
|
|
78
|
+
out[outIndex] = target?.componentBitmask.has(componentEid)
|
|
79
|
+
? target._get(componentEid)
|
|
80
|
+
: undefined;
|
|
81
|
+
src[outIndex] = target;
|
|
82
|
+
outIndex++;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
export function directInjectEids(inject) {
|
|
87
|
+
return inject.filter((term) => typeof term === "number");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Per-iteration cursor passed to `each` / `forEach` / `enter` / `exit` /
|
|
91
|
+
* `update` / `sort` callbacks when the caller opts in by passing `Iter` as
|
|
92
|
+
* the first argument:
|
|
93
|
+
*
|
|
94
|
+
* ```ts
|
|
95
|
+
* system.each(Iter, [Body, { up: [ChildOf, [Position]] }], (it, [body, pos]) => {
|
|
96
|
+
* it.entity; // the visited entity
|
|
97
|
+
* it.src[0]; // entity `body` was read from (the visited entity)
|
|
98
|
+
* it.src[1]; // entity `pos` was read from (the ChildOf target), or undefined
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* A single instance is created when the iteration is set up and mutated before
|
|
103
|
+
* every callback, so it allocates nothing per entity. Read what you need inside
|
|
104
|
+
* the callback; do not retain the cursor or its {@link src} array across
|
|
105
|
+
* callbacks.
|
|
106
|
+
*/
|
|
107
|
+
export class Iter {
|
|
108
|
+
constructor(arity) {
|
|
109
|
+
this.src = new Array(arity);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function isCursorMarker(x) {
|
|
113
|
+
return x === Entity || x === Iter;
|
|
114
|
+
}
|
|
115
|
+
export function wantsIter(x) {
|
|
116
|
+
return x === Iter;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Iterate `entities`, resolving injected components per the `forEach` /
|
|
120
|
+
* `each` argument grammar (bare callback, `[components]`, `Entity`/`Iter`
|
|
121
|
+
* cursor markers). Runs inside a deferred scope so mutations made by the
|
|
122
|
+
* callback are buffered and applied after iteration finishes.
|
|
123
|
+
*
|
|
124
|
+
* Shared by {@link Query.forEach} and {@link Group.forEach} so both honour the
|
|
125
|
+
* same injection and deferral semantics.
|
|
126
|
+
*/
|
|
127
|
+
export function forEachInjected(world, entities, arg0, arg1, arg2) {
|
|
128
|
+
world.beginDefer();
|
|
129
|
+
try {
|
|
130
|
+
// Bare `forEach(callback)`: a function that is not a cursor marker.
|
|
131
|
+
if (typeof arg0 === "function" && !isCursorMarker(arg0)) {
|
|
132
|
+
for (const entity of entities) {
|
|
133
|
+
arg0(entity);
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const useIter = wantsIter(arg0);
|
|
138
|
+
const components = (isCursorMarker(arg0) ? arg1 : arg0);
|
|
139
|
+
const callback = (isCursorMarker(arg0) ? arg2 : arg1);
|
|
140
|
+
const invoke = makeInjectedInvoker(world, components, useIter, callback);
|
|
141
|
+
for (const entity of entities) {
|
|
142
|
+
invoke(entity);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
world.endDefer();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function makeInjectedInvoker(world, components, useIter, callback) {
|
|
150
|
+
const inject = mapInject(world, components);
|
|
151
|
+
const arity = injectArity(inject);
|
|
152
|
+
const resolved = new Array(arity);
|
|
153
|
+
const down = _findSingleDownInject(inject);
|
|
154
|
+
if (down !== undefined) {
|
|
155
|
+
if (useIter) {
|
|
156
|
+
const it = new Iter(arity);
|
|
157
|
+
return (e) => {
|
|
158
|
+
const children = e._childrenByEid(down.relEid);
|
|
159
|
+
if (children === undefined) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
it.entity = e;
|
|
163
|
+
getInjectedWithSrcSkippingDown(e, inject, resolved, it.src);
|
|
164
|
+
children.forEach((child) => {
|
|
165
|
+
fillDownInject(child, down.componentEids, down.slot, resolved, it.src);
|
|
166
|
+
callback(it, resolved);
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return (e) => {
|
|
171
|
+
const children = e._childrenByEid(down.relEid);
|
|
172
|
+
if (children === undefined) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
getInjectedSkippingDown(e, inject, resolved);
|
|
176
|
+
children.forEach((child) => {
|
|
177
|
+
fillDownInject(child, down.componentEids, down.slot, resolved);
|
|
178
|
+
callback(e, resolved);
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (useIter) {
|
|
183
|
+
const it = new Iter(arity);
|
|
184
|
+
return (e) => {
|
|
185
|
+
it.entity = e;
|
|
186
|
+
getInjectedWithSrc(e, inject, resolved, it.src);
|
|
187
|
+
callback(it, resolved);
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return (e) => {
|
|
191
|
+
getInjected(e, inject, false, resolved);
|
|
192
|
+
callback(e, resolved);
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function _findSingleDownInject(inject) {
|
|
196
|
+
let found;
|
|
197
|
+
let slot = 0;
|
|
198
|
+
inject.forEach((term) => {
|
|
199
|
+
if (typeof term === "number") {
|
|
200
|
+
slot++;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if ("up" in term) {
|
|
204
|
+
slot += term.up[1].length;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (found !== undefined) {
|
|
208
|
+
throw new Error("Only one down injection is supported per tuple");
|
|
209
|
+
}
|
|
210
|
+
found = { relEid: term.down[0], componentEids: term.down[1], slot };
|
|
211
|
+
slot += term.down[1].length;
|
|
212
|
+
});
|
|
213
|
+
return found;
|
|
214
|
+
}
|
|
215
|
+
function fillDownInject(child, componentEids, slot, out, src) {
|
|
216
|
+
componentEids.forEach((componentEid, offset) => {
|
|
217
|
+
const outIndex = slot + offset;
|
|
218
|
+
out[outIndex] = child.componentBitmask.has(componentEid) ? child._get(componentEid) : undefined;
|
|
219
|
+
if (src) {
|
|
220
|
+
src[outIndex] = child;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function getInjectedSkippingDown(e, inject, out) {
|
|
225
|
+
let outIndex = 0;
|
|
226
|
+
inject.forEach((term) => {
|
|
227
|
+
if (typeof term === "number") {
|
|
228
|
+
out[outIndex++] = e._get(term);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if ("down" in term) {
|
|
232
|
+
outIndex += term.down[1].length;
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const target = e.componentBitmask.has(term.up[0])
|
|
236
|
+
? e._get(term.up[0])?.target
|
|
237
|
+
: undefined;
|
|
238
|
+
term.up[1].forEach((componentEid) => {
|
|
239
|
+
out[outIndex++] = target?.componentBitmask.has(componentEid)
|
|
240
|
+
? target._get(componentEid)
|
|
241
|
+
: undefined;
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function getInjectedWithSrcSkippingDown(e, inject, out, src) {
|
|
246
|
+
let outIndex = 0;
|
|
247
|
+
inject.forEach((term) => {
|
|
248
|
+
if (typeof term === "number") {
|
|
249
|
+
out[outIndex] = e._get(term);
|
|
250
|
+
src[outIndex] = e;
|
|
251
|
+
outIndex++;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if ("down" in term) {
|
|
255
|
+
outIndex += term.down[1].length;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const target = e.componentBitmask.has(term.up[0])
|
|
259
|
+
? e._get(term.up[0])?.target
|
|
260
|
+
: undefined;
|
|
261
|
+
term.up[1].forEach((componentEid) => {
|
|
262
|
+
out[outIndex] = target?.componentBitmask.has(componentEid)
|
|
263
|
+
? target._get(componentEid)
|
|
264
|
+
: undefined;
|
|
265
|
+
src[outIndex] = target;
|
|
266
|
+
outIndex++;
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.js","sourceRoot":"","sources":["../src/inject.ts"],"names":[],"mappings":"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"}
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Component } from "./component.js";
|
|
2
|
+
import { type World } from "./world/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base class for built-in world modules.
|
|
5
|
+
*
|
|
6
|
+
* A `Module` is a special component entity that is registered by the world at
|
|
7
|
+
* construction time and performs one-time initialisation (registering
|
|
8
|
+
* components, setting up hooks, etc.) via its {@link init} method.
|
|
9
|
+
*
|
|
10
|
+
* User code does not instantiate `Module` subclasses directly; they are
|
|
11
|
+
* created and initialised by the world internally.
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class Module extends Component {
|
|
14
|
+
constructor(world: World, eid: number);
|
|
15
|
+
/**
|
|
16
|
+
* Initialise this module.
|
|
17
|
+
*
|
|
18
|
+
* Called once by the world after the module entity has been created and
|
|
19
|
+
* registered. Implementations should register components, attach hooks, and
|
|
20
|
+
* perform any other world-level setup required by the module.
|
|
21
|
+
*/
|
|
22
|
+
abstract init(): void;
|
|
23
|
+
}
|
package/dist/module.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component } from "./component.js";
|
|
2
|
+
/**
|
|
3
|
+
* Base class for built-in world modules.
|
|
4
|
+
*
|
|
5
|
+
* A `Module` is a special component entity that is registered by the world at
|
|
6
|
+
* construction time and performs one-time initialisation (registering
|
|
7
|
+
* components, setting up hooks, etc.) via its {@link init} method.
|
|
8
|
+
*
|
|
9
|
+
* User code does not instantiate `Module` subclasses directly; they are
|
|
10
|
+
* created and initialised by the world internally.
|
|
11
|
+
*/
|
|
12
|
+
export class Module extends Component {
|
|
13
|
+
constructor(world, eid) {
|
|
14
|
+
super(world, eid);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C;;;;;;;;;GASG;AACH,MAAM,OAAgB,MAAO,SAAQ,SAAS;IAC5C,YAAY,KAAY,EAAE,GAAW;QACnC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC;CAUF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Module } from "../module.js";
|
|
2
|
+
/**
|
|
3
|
+
* Built-in world module that maintains the name → entity index.
|
|
4
|
+
*
|
|
5
|
+
* Registers hooks on the `Identity` component so that whenever an entity's
|
|
6
|
+
* `name` is set or cleared, `world._identityNameIndex` is updated accordingly.
|
|
7
|
+
* This powers the string-overloads of {@link World.entity} and
|
|
8
|
+
* {@link World.getEntity} that resolve entities by name.
|
|
9
|
+
*
|
|
10
|
+
* Registered automatically by every {@link World}; user code does not interact
|
|
11
|
+
* with `IdentityModule` directly.
|
|
12
|
+
*/
|
|
13
|
+
export declare class IdentityModule extends Module {
|
|
14
|
+
init(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Identity } from "../entity/index.js";
|
|
2
|
+
import { Module } from "../module.js";
|
|
3
|
+
/**
|
|
4
|
+
* Built-in world module that maintains the name → entity index.
|
|
5
|
+
*
|
|
6
|
+
* Registers hooks on the `Identity` component so that whenever an entity's
|
|
7
|
+
* `name` is set or cleared, `world._identityNameIndex` is updated accordingly.
|
|
8
|
+
* This powers the string-overloads of {@link World.entity} and
|
|
9
|
+
* {@link World.getEntity} that resolve entities by name.
|
|
10
|
+
*
|
|
11
|
+
* Registered automatically by every {@link World}; user code does not interact
|
|
12
|
+
* with `IdentityModule` directly.
|
|
13
|
+
*/
|
|
14
|
+
export class IdentityModule extends Module {
|
|
15
|
+
init() {
|
|
16
|
+
const index = this.world._identityNameIndex;
|
|
17
|
+
const indexed = this.world._identityIndexedNames;
|
|
18
|
+
const component = this.world.component(Identity);
|
|
19
|
+
component.onSet((entity, identity) => {
|
|
20
|
+
const prev = indexed.get(entity);
|
|
21
|
+
if (prev !== undefined && index.get(prev) === entity) {
|
|
22
|
+
index.delete(prev);
|
|
23
|
+
}
|
|
24
|
+
if (identity.name) {
|
|
25
|
+
index.set(identity.name, entity);
|
|
26
|
+
indexed.set(entity, identity.name);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
indexed.delete(entity);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
component.onRemove((entity) => {
|
|
33
|
+
const prev = indexed.get(entity);
|
|
34
|
+
if (prev !== undefined && index.get(prev) === entity) {
|
|
35
|
+
index.delete(prev);
|
|
36
|
+
}
|
|
37
|
+
indexed.delete(entity);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/modules/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAe,SAAQ,MAAM;IACjC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEjD,SAAS,CAAC,KAAK,CAAC,CAAC,MAAc,EAAE,QAAkB,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEjC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gBACrD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAc,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEjC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gBACrD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Module } from "../module.js";
|
|
2
|
+
/**
|
|
3
|
+
* Marker component used to tag a component class as a singleton.
|
|
4
|
+
*
|
|
5
|
+
* Attach it to a component entity to make that component class a singleton: at
|
|
6
|
+
* most one entity in the world may hold the component at any time. Attempting
|
|
7
|
+
* to add the component to a second entity throws.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* world.component(Gravity).add(Singleton); // Gravity is now a singleton
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* The constraint itself is enforced by {@link SingletonModule}.
|
|
14
|
+
*/
|
|
15
|
+
export declare class Singleton {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Built-in world module that enforces the singleton constraint.
|
|
19
|
+
*
|
|
20
|
+
* Registered automatically by every {@link World}. When a component entity has
|
|
21
|
+
* the `Singleton` component attached, the module installs an `onAdd` hook on
|
|
22
|
+
* that component class so that adding it to more than one entity throws.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SingletonModule extends Module {
|
|
25
|
+
init(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Module } from "../module.js";
|
|
2
|
+
/**
|
|
3
|
+
* Marker component used to tag a component class as a singleton.
|
|
4
|
+
*
|
|
5
|
+
* Attach it to a component entity to make that component class a singleton: at
|
|
6
|
+
* most one entity in the world may hold the component at any time. Attempting
|
|
7
|
+
* to add the component to a second entity throws.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* world.component(Gravity).add(Singleton); // Gravity is now a singleton
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* The constraint itself is enforced by {@link SingletonModule}.
|
|
14
|
+
*/
|
|
15
|
+
export class Singleton {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Built-in world module that enforces the singleton constraint.
|
|
19
|
+
*
|
|
20
|
+
* Registered automatically by every {@link World}. When a component entity has
|
|
21
|
+
* the `Singleton` component attached, the module installs an `onAdd` hook on
|
|
22
|
+
* that component class so that adding it to more than one entity throws.
|
|
23
|
+
*/
|
|
24
|
+
export class SingletonModule extends Module {
|
|
25
|
+
init() {
|
|
26
|
+
this.world.component(Singleton);
|
|
27
|
+
this.world.component(Singleton).onAdd((target) => {
|
|
28
|
+
const targetMeta = target.ownMeta;
|
|
29
|
+
if (targetMeta.usageCount !== 0) {
|
|
30
|
+
throw new Error(`Cannot make component ${targetMeta.Class.name} singleton; ${targetMeta.usageCount} instance(s) already exist`);
|
|
31
|
+
}
|
|
32
|
+
targetMeta.onAdd((entity) => {
|
|
33
|
+
if (entity !== target || targetMeta.usageCount !== 1) {
|
|
34
|
+
throw new Error(`Cannot add singleton component ${targetMeta.Class.name} to entity ${entity.eid}; singleton instance is entity ${target.eid}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
target.add(target);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=singleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/modules/singleton.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,SAAS;CAAG;AAEzB;;;;;;GAMG;AACH,MAAM,OAAO,eAAgB,SAAQ,MAAM;IAClC,IAAI;QACT,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEhC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,MAAc,EAAQ,EAAE;YAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;YAClC,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,yBAAyB,UAAU,CAAC,KAAK,CAAC,IAAI,eAAe,UAAU,CAAC,UAAU,4BAA4B,CAC/G,CAAC;YACJ,CAAC;YAED,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,IAAI,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oBACrD,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,CAAC,KAAK,CAAC,IAAI,cAAc,MAAM,CAAC,GAAG,kCAAkC,MAAM,CAAC,GAAG,EAAE,CAC9H,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/package.json
CHANGED
|
@@ -1,32 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vworlds/vecs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"development": {
|
|
10
|
+
"types": "./src/index.ts",
|
|
11
|
+
"import": "./src/index.ts"
|
|
12
|
+
},
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
7
17
|
"scripts": {
|
|
8
|
-
"clean": "rimraf dist
|
|
9
|
-
"prepack": "
|
|
10
|
-
"build": "
|
|
11
|
-
"compile": "tsc
|
|
18
|
+
"clean": "rimraf dist",
|
|
19
|
+
"prepack": "npm run build",
|
|
20
|
+
"build": "npm run clean && npm run compile",
|
|
21
|
+
"compile": "tsc -p tsconfig.build.json && cp \"./package.json\" ./dist/",
|
|
22
|
+
"bench:ecs": "NODE_OPTIONS=--max-old-space-size=32768 RUN_VECS_ECS_BENCH=1 vitest run tests/ecs.bench.test.ts --pool=forks --poolOptions.forks.singleFork",
|
|
12
23
|
"test": "vitest run",
|
|
13
24
|
"test:watch": "vitest",
|
|
14
|
-
"lint": "eslint src
|
|
25
|
+
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\" --no-error-on-unmatched-pattern",
|
|
15
26
|
"typecheck": "tsc --noEmit",
|
|
16
|
-
"format:check": "prettier --check \"**/*.{ts,md}\""
|
|
17
|
-
"prepare": "husky"
|
|
18
|
-
},
|
|
19
|
-
"devDependencies": {
|
|
20
|
-
"@types/node": "^20.0.0",
|
|
21
|
-
"@typescript-eslint/eslint-plugin": "^8.59.1",
|
|
22
|
-
"@typescript-eslint/parser": "^8.59.1",
|
|
23
|
-
"eslint": "^10.2.1",
|
|
24
|
-
"husky": "^9.1.7",
|
|
25
|
-
"lint-staged": "^16.4.0",
|
|
26
|
-
"prettier": "^3.8.3",
|
|
27
|
-
"rimraf": "^5.0.0",
|
|
28
|
-
"typescript": "^4.8.4",
|
|
29
|
-
"vitest": "^1.6.0"
|
|
27
|
+
"format:check": "prettier --check \"**/*.{ts,md}\""
|
|
30
28
|
},
|
|
31
29
|
"dependencies": {
|
|
32
30
|
"eventemitter3": "^4.0.7"
|
package/dist/phase.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type World } from "./world.js";
|
|
1
|
+
import { type World } from "./world/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Public interface for a pipeline phase, returned by {@link World.addPhase}.
|
|
4
4
|
*
|
|
@@ -12,7 +12,7 @@ import { type World } from "./world.js";
|
|
|
12
12
|
* world.system("NetworkUpdate").phase(preUpdate).run(tick);
|
|
13
13
|
*
|
|
14
14
|
* // each frame:
|
|
15
|
-
* world.beginFrame(
|
|
15
|
+
* world.beginFrame(delta);
|
|
16
16
|
* try {
|
|
17
17
|
* world.runPhase(preUpdate, now, delta);
|
|
18
18
|
* world.runPhase(send, now, delta);
|
|
@@ -0,0 +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";
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ComponentType } from "../component.js";
|
|
2
|
+
import { Entity } from "../entity/index.js";
|
|
3
|
+
import { type World } from "../world/index.js";
|
|
4
|
+
import { type Term } from "../terms/term.js";
|
|
5
|
+
export declare const SOURCE_TRACKED_QUERY_ERROR = "source/children is not supported in a tracked query; use world.filter(...)";
|
|
6
|
+
export declare const EMPTY_ENTITIES: ReadonlySet<Entity>;
|
|
7
|
+
export declare function _setGroupedQueryCtor(ctor: new (...args: any[]) => any): void;
|
|
8
|
+
export declare function _getGroupedQueryCtor(): new (...args: any[]) => any;
|
|
9
|
+
export declare class Base<R extends ComponentType[] = []> {
|
|
10
|
+
/** Entity that stores this query as a component and carries query traits. */
|
|
11
|
+
readonly entity: Entity;
|
|
12
|
+
/** Materialized root term that owns membership for this query. */
|
|
13
|
+
rootTerm: Term | undefined;
|
|
14
|
+
constructor(name: string, world: World, componentClass: ComponentType, track?: boolean);
|
|
15
|
+
/** `true` once this query has been registered with its world. */
|
|
16
|
+
get built(): boolean;
|
|
17
|
+
/** Unique display name; forwards to the backing entity identity. */
|
|
18
|
+
get name(): string | undefined;
|
|
19
|
+
/** World that owns this query; forwards to the backing entity. */
|
|
20
|
+
get world(): World;
|
|
21
|
+
/** Returns the query name. */
|
|
22
|
+
toString(): string;
|
|
23
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ArrayMap } from "../util/array_map.js";
|
|
2
|
+
import { Bitset } from "../util/bitset.js";
|
|
3
|
+
export const SOURCE_TRACKED_QUERY_ERROR = "source/children is not supported in a tracked query; use world.filter(...)";
|
|
4
|
+
export const EMPTY_ENTITIES = new Set();
|
|
5
|
+
let _GroupedQueryCtor;
|
|
6
|
+
export function _setGroupedQueryCtor(ctor) {
|
|
7
|
+
_GroupedQueryCtor = ctor;
|
|
8
|
+
}
|
|
9
|
+
export function _getGroupedQueryCtor() {
|
|
10
|
+
return _GroupedQueryCtor;
|
|
11
|
+
}
|
|
12
|
+
export class Base {
|
|
13
|
+
constructor(name, world, componentClass, track = true) {
|
|
14
|
+
/** @internal `true` once `query` or `requires` has set an explicit predicate. */
|
|
15
|
+
this._hasExplicitQuery = false;
|
|
16
|
+
/** @internal DSL predicate used to build the root membership term. */
|
|
17
|
+
this._dsl = undefined;
|
|
18
|
+
/** @internal `true` once this query has been registered with its world. */
|
|
19
|
+
this._built = false;
|
|
20
|
+
/** @internal Guards destroy hooks against recursive removal. */
|
|
21
|
+
this._destroyed = false;
|
|
22
|
+
/** @internal Whether membership APIs are enabled for this query. */
|
|
23
|
+
this._tracking = false;
|
|
24
|
+
/** @internal `enter` callback (already wraps any injection logic). */
|
|
25
|
+
this._enterCallback = undefined;
|
|
26
|
+
/** @internal `exit` callback (already wraps any injection logic). */
|
|
27
|
+
this._exitCallback = undefined;
|
|
28
|
+
/** @internal Component eids the exit callback needs snapshotted before component removal. */
|
|
29
|
+
this._exitSnapshotTypes = undefined;
|
|
30
|
+
/** @internal Per-component-eid `update` callbacks. */
|
|
31
|
+
this._componentUpdateCallbacks = new ArrayMap();
|
|
32
|
+
/** @internal Bitmask of component eids this query reacts to via `update`. */
|
|
33
|
+
this._watchlistBitmask = new Bitset();
|
|
34
|
+
this._queryComponentClass = componentClass;
|
|
35
|
+
this.entity = world.entity();
|
|
36
|
+
this.entity.name = name;
|
|
37
|
+
this.entity.attach(componentClass, this);
|
|
38
|
+
world._addUnbuiltQuery(this);
|
|
39
|
+
if (track) {
|
|
40
|
+
this.track();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** @internal Throw when a builder method is called after registration. */
|
|
44
|
+
_assertConfigurable() {
|
|
45
|
+
if (this.built) {
|
|
46
|
+
throw new Error(`query '${this.name}' has already been built`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** @internal Whether this object has enough configuration to enter the world. */
|
|
50
|
+
_isBuildable() {
|
|
51
|
+
return this._dsl !== undefined;
|
|
52
|
+
}
|
|
53
|
+
/** `true` once this query has been registered with its world. */
|
|
54
|
+
get built() {
|
|
55
|
+
return this._built;
|
|
56
|
+
}
|
|
57
|
+
/** Unique display name; forwards to the backing entity identity. */
|
|
58
|
+
get name() {
|
|
59
|
+
return this.entity.name;
|
|
60
|
+
}
|
|
61
|
+
/** World that owns this query; forwards to the backing entity. */
|
|
62
|
+
get world() {
|
|
63
|
+
return this.entity.world;
|
|
64
|
+
}
|
|
65
|
+
/** Returns the query name. */
|
|
66
|
+
toString() {
|
|
67
|
+
return this.name ?? "";
|
|
68
|
+
}
|
|
69
|
+
/** @internal */
|
|
70
|
+
_matchedEntities() {
|
|
71
|
+
if (!this._tracking) {
|
|
72
|
+
return EMPTY_ENTITIES;
|
|
73
|
+
}
|
|
74
|
+
return this._entities ?? this.rootTerm ?? EMPTY_ENTITIES;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=query.00.base.js.map
|