@vworlds/vecs 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +249 -119
  2. package/dist/component.d.ts +52 -76
  3. package/dist/component.js +60 -45
  4. package/dist/component.js.map +1 -1
  5. package/dist/component_meta.d.ts +98 -0
  6. package/dist/component_meta.js +65 -0
  7. package/dist/component_meta.js.map +1 -0
  8. package/dist/dsl.d.ts +46 -34
  9. package/dist/dsl.js +459 -61
  10. package/dist/dsl.js.map +1 -1
  11. package/dist/entity/entity.base.d.ts +57 -0
  12. package/dist/entity/entity.base.js +81 -0
  13. package/dist/entity/entity.base.js.map +1 -0
  14. package/dist/entity/entity.components.d.ts +117 -0
  15. package/dist/entity/entity.components.js +244 -0
  16. package/dist/entity/entity.components.js.map +1 -0
  17. package/dist/entity/entity.d.ts +35 -0
  18. package/dist/entity/entity.identity.d.ts +8 -0
  19. package/dist/entity/entity.identity.js +15 -0
  20. package/dist/entity/entity.identity.js.map +1 -0
  21. package/dist/entity/entity.js +33 -0
  22. package/dist/entity/entity.js.map +1 -0
  23. package/dist/entity/entity.lifecycle.d.ts +12 -0
  24. package/dist/entity/entity.lifecycle.js +111 -0
  25. package/dist/entity/entity.lifecycle.js.map +1 -0
  26. package/dist/entity/entity.queries.d.ts +3 -0
  27. package/dist/entity/entity.queries.js +33 -0
  28. package/dist/entity/entity.queries.js.map +1 -0
  29. package/dist/entity/entity.relationships.d.ts +9 -0
  30. package/dist/entity/entity.relationships.js +74 -0
  31. package/dist/entity/entity.relationships.js.map +1 -0
  32. package/dist/entity/index.d.ts +2 -0
  33. package/dist/entity/index.js +3 -0
  34. package/dist/entity/index.js.map +1 -0
  35. package/dist/filter.d.ts +27 -8
  36. package/dist/filter.js +33 -18
  37. package/dist/filter.js.map +1 -1
  38. package/dist/index.d.ts +13 -5
  39. package/dist/index.js +13 -2
  40. package/dist/index.js.map +1 -1
  41. package/dist/inject.d.ts +80 -0
  42. package/dist/inject.js +270 -0
  43. package/dist/inject.js.map +1 -0
  44. package/dist/module.d.ts +23 -0
  45. package/dist/module.js +17 -0
  46. package/dist/module.js.map +1 -0
  47. package/dist/modules/identity.d.ts +15 -0
  48. package/dist/modules/identity.js +41 -0
  49. package/dist/modules/identity.js.map +1 -0
  50. package/dist/modules/singleton.d.ts +26 -0
  51. package/dist/modules/singleton.js +41 -0
  52. package/dist/modules/singleton.js.map +1 -0
  53. package/dist/package.json +12 -1
  54. package/dist/phase.d.ts +2 -2
  55. package/dist/query/index.d.ts +6 -0
  56. package/dist/query/index.js +5 -0
  57. package/dist/query/index.js.map +1 -0
  58. package/dist/query/query.00.base.d.ts +23 -0
  59. package/dist/query/query.00.base.js +77 -0
  60. package/dist/query/query.00.base.js.map +1 -0
  61. package/dist/query/query.01.reactive.d.ts +7 -0
  62. package/dist/query/query.01.reactive.js +58 -0
  63. package/dist/query/query.01.reactive.js.map +1 -0
  64. package/dist/query/query.02.lifecycle.d.ts +6 -0
  65. package/dist/query/query.02.lifecycle.js +63 -0
  66. package/dist/query/query.02.lifecycle.js.map +1 -0
  67. package/dist/query/query.03.tracking.d.ts +15 -0
  68. package/dist/query/query.03.tracking.js +31 -0
  69. package/dist/query/query.03.tracking.js.map +1 -0
  70. package/dist/query/query.04.callbacks.d.ts +14 -0
  71. package/dist/query/query.04.callbacks.js +65 -0
  72. package/dist/query/query.04.callbacks.js.map +1 -0
  73. package/dist/query/query.05.updates.d.ts +14 -0
  74. package/dist/query/query.05.updates.js +81 -0
  75. package/dist/query/query.05.updates.js.map +1 -0
  76. package/dist/query/query.06.predicate.d.ts +13 -0
  77. package/dist/query/query.06.predicate.js +40 -0
  78. package/dist/query/query.06.predicate.js.map +1 -0
  79. package/dist/query/query.07.groups.d.ts +41 -0
  80. package/dist/query/query.07.groups.js +110 -0
  81. package/dist/query/query.07.groups.js.map +1 -0
  82. package/dist/query/query.d.ts +53 -0
  83. package/dist/query/query.js +138 -0
  84. package/dist/query/query.js.map +1 -0
  85. package/dist/relationship.d.ts +19 -0
  86. package/dist/relationship.js +18 -0
  87. package/dist/relationship.js.map +1 -0
  88. package/dist/system.d.ts +37 -23
  89. package/dist/system.js +80 -64
  90. package/dist/system.js.map +1 -1
  91. package/dist/terms/all_term.d.ts +32 -0
  92. package/dist/terms/all_term.js +41 -0
  93. package/dist/terms/all_term.js.map +1 -0
  94. package/dist/terms/any_term.d.ts +33 -0
  95. package/dist/terms/any_term.js +42 -0
  96. package/dist/terms/any_term.js.map +1 -0
  97. package/dist/terms/build.d.ts +62 -0
  98. package/dist/terms/build.js +382 -0
  99. package/dist/terms/build.js.map +1 -0
  100. package/dist/terms/component_term.d.ts +37 -0
  101. package/dist/terms/component_term.js +49 -0
  102. package/dist/terms/component_term.js.map +1 -0
  103. package/dist/terms/empty_term.d.ts +6 -0
  104. package/dist/terms/empty_term.js +12 -0
  105. package/dist/terms/empty_term.js.map +1 -0
  106. package/dist/terms/index.d.ts +11 -0
  107. package/dist/terms/index.js +12 -0
  108. package/dist/terms/index.js.map +1 -0
  109. package/dist/terms/not_term.d.ts +35 -0
  110. package/dist/terms/not_term.js +47 -0
  111. package/dist/terms/not_term.js.map +1 -0
  112. package/dist/terms/only_term.d.ts +47 -0
  113. package/dist/terms/only_term.js +79 -0
  114. package/dist/terms/only_term.js.map +1 -0
  115. package/dist/terms/predicate_term.d.ts +80 -0
  116. package/dist/terms/predicate_term.js +109 -0
  117. package/dist/terms/predicate_term.js.map +1 -0
  118. package/dist/terms/target_term.d.ts +43 -0
  119. package/dist/terms/target_term.js +87 -0
  120. package/dist/terms/target_term.js.map +1 -0
  121. package/dist/terms/term.d.ts +94 -0
  122. package/dist/terms/term.js +202 -0
  123. package/dist/terms/term.js.map +1 -0
  124. package/dist/terms/world_term.d.ts +68 -0
  125. package/dist/terms/world_term.js +99 -0
  126. package/dist/terms/world_term.js.map +1 -0
  127. package/dist/timer.js +2 -2
  128. package/dist/timer.js.map +1 -1
  129. package/dist/util/array_map.js +12 -0
  130. package/dist/util/array_map.js.map +1 -1
  131. package/dist/util/bitset.js +107 -22
  132. package/dist/util/bitset.js.map +1 -1
  133. package/dist/util/dense_set.d.ts +1 -0
  134. package/dist/util/dense_set.js +90 -0
  135. package/dist/util/dense_set.js.map +1 -0
  136. package/dist/util/id_pool.d.ts +30 -0
  137. package/dist/util/id_pool.js +222 -0
  138. package/dist/util/id_pool.js.map +1 -0
  139. package/dist/world/index.d.ts +3 -0
  140. package/dist/world/index.js +3 -0
  141. package/dist/world/index.js.map +1 -0
  142. package/dist/world/world.base.d.ts +6 -0
  143. package/dist/world/world.base.js +21 -0
  144. package/dist/world/world.base.js.map +1 -0
  145. package/dist/world/world.components.d.ts +67 -0
  146. package/dist/world/world.components.js +93 -0
  147. package/dist/world/world.components.js.map +1 -0
  148. package/dist/world/world.d.ts +29 -0
  149. package/dist/world/world.deferred.d.ts +13 -0
  150. package/dist/world/world.deferred.js +93 -0
  151. package/dist/world/world.deferred.js.map +1 -0
  152. package/dist/world/world.entities.d.ts +18 -0
  153. package/dist/world/world.entities.js +97 -0
  154. package/dist/world/world.entities.js.map +1 -0
  155. package/dist/world/world.js +39 -0
  156. package/dist/world/world.js.map +1 -0
  157. package/dist/world/world.modules.d.ts +12 -0
  158. package/dist/world/world.modules.js +21 -0
  159. package/dist/world/world.modules.js.map +1 -0
  160. package/dist/world/world.pipeline.d.ts +21 -0
  161. package/dist/world/world.pipeline.js +106 -0
  162. package/dist/world/world.pipeline.js.map +1 -0
  163. package/dist/world/world.pools.d.ts +9 -0
  164. package/dist/world/world.pools.js +63 -0
  165. package/dist/world/world.pools.js.map +1 -0
  166. package/dist/world/world.queries.d.ts +18 -0
  167. package/dist/world/world.queries.js +101 -0
  168. package/dist/world/world.queries.js.map +1 -0
  169. package/dist/world/world.storage.d.ts +7 -0
  170. package/dist/world/world.storage.js +26 -0
  171. package/dist/world/world.storage.js.map +1 -0
  172. package/package.json +12 -1
  173. package/dist/entity.d.ts +0 -215
  174. package/dist/entity.js +0 -457
  175. package/dist/entity.js.map +0 -1
  176. package/dist/query.d.ts +0 -251
  177. package/dist/query.js +0 -353
  178. package/dist/query.js.map +0 -1
  179. package/dist/world.d.ts +0 -389
  180. package/dist/world.js +0 -631
  181. package/dist/world.js.map +0 -1
package/dist/world.js DELETED
@@ -1,631 +0,0 @@
1
- import { ComponentMeta } from "./component.js";
2
- import { Entity } from "./entity.js";
3
- import { Query } from "./query.js";
4
- import { System } from "./system.js";
5
- import { Filter } from "./filter.js";
6
- import { ArrayMap } from "./util/array_map.js";
7
- import { Phase } from "./phase.js";
8
- import { ALWAYS_TICK_SOURCE } from "./timer.js";
9
- /**
10
- * Numeric type ids below this value are reserved for components whose id was
11
- * pre-registered via {@link World.registerComponentType} (typically server
12
- * assigned). Auto-assigned ids start here.
13
- */
14
- const LOCAL_COMPONENT_MIN = 256;
15
- /**
16
- * The central ECS container. One world per game session.
17
- *
18
- * A `World` owns every entity, every registered component class, every
19
- * registered query / system, and the update pipeline. The typical lifecycle:
20
- *
21
- * 1. **Register components** — {@link registerComponent} (and optionally
22
- * {@link registerComponentType}) for every component class you plan to use.
23
- * 2. **Build the pipeline** — {@link addPhase} for every named phase, then
24
- * {@link system} / {@link query} for each processor.
25
- * 3. **Start** — call {@link start} to freeze component registration and
26
- * distribute systems into their phases.
27
- * 4. **Run loop** — call {@link runPhase} per phase or {@link progress} for
28
- * every phase, once per frame.
29
- *
30
- * ```ts
31
- * const world = new World();
32
- *
33
- * class Position { x = 0; y = 0; }
34
- * class Velocity { vx = 0; vy = 0; }
35
- *
36
- * world.registerComponent(Position);
37
- * world.registerComponent(Velocity);
38
- *
39
- * world.system("Move")
40
- * .requires(Position, Velocity)
41
- * .each([Position, Velocity], (e, [pos, vel]) => {
42
- * pos.x += vel.vx;
43
- * e.modified(Position);
44
- * });
45
- *
46
- * world.start();
47
- *
48
- * // game loop:
49
- * world.progress(now, delta);
50
- * ```
51
- *
52
- * ## Deferred mode
53
- *
54
- * The world can be in **deferred mode**, in which case entity mutations
55
- * (`add` / `attach` / `set` / `remove` / `destroy` / `setParent` / `modified`) are
56
- * queued instead of applied inline. Systems run inside an automatically
57
- * deferred scope; user code can wrap arbitrary blocks with
58
- * {@link beginDefer} / {@link endDefer} or {@link defer}. {@link flush}
59
- * drains the queue at top level.
60
- */
61
- export class World {
62
- constructor() {
63
- /** @internal Entity id → entity. Owns every live entity. */
64
- this._entities = new Map();
65
- /** @internal All registered queries, including systems (which extend `Query`). */
66
- this._queries = [];
67
- /** @internal Component type id → meta record. */
68
- this._Type2Meta = new ArrayMap();
69
- /** @internal Pre-registered name → type id mappings (server-assigned ids). */
70
- this._componentNameTypeMap = new Map();
71
- /** @internal Counter used to auto-assign type ids for "local" components (≥ 256). */
72
- this._localComponentCounter = LOCAL_COMPONENT_MIN;
73
- /** @internal `true` once {@link start} (or {@link disableComponentRegistration}) has been called. */
74
- this._componentRegistrationDisabled = false;
75
- /** @internal Auto-incrementing entity id counter, seeded by {@link setEntityIdRange}. */
76
- this._eidCounter = 0;
77
- /** @internal Single ordered command queue used in deferred mode. */
78
- this._commandQueue = [];
79
- /** @internal Nested {@link beginDefer} / {@link endDefer} count. */
80
- this._deferredDepth = 0;
81
- /** @internal `true` while {@link _processCommandQueue} is iterating, to avoid re-entrant drains. */
82
- this._draining = false;
83
- /** @internal Phase name → phase. Insertion-ordered, matches pipeline execution order. */
84
- this._pipeline = new Map();
85
- /** @internal World-owned tick sources evaluated once per frame. */
86
- this._tickSources = new Set();
87
- /** @internal Monotonic frame id used to memoize tick-source evaluation. */
88
- this._frameCounter = 0;
89
- /** @internal True while the world is driving one logical frame. */
90
- this._frameInProgress = false;
91
- /** Hidden property key used to store this world's meta on component classes. */
92
- this.worldKey = `__vecs_world_${Math.random().toString(36).slice(2)}`;
93
- this._tickSources.add(ALWAYS_TICK_SOURCE);
94
- }
95
- /**
96
- * @internal Drain the top-level command queue: walk it in arrival order,
97
- * executing each command. Callbacks may push more commands; they are picked
98
- * up by index iteration in the same pass.
99
- */
100
- _processCommandQueue() {
101
- if (this._draining) {
102
- return;
103
- }
104
- if (this._commandQueue.length === 0) {
105
- return;
106
- }
107
- this._draining = true;
108
- try {
109
- for (let i = 0; i < this._commandQueue.length; i++) {
110
- this._executeCommand(this._commandQueue[i]);
111
- }
112
- this._commandQueue.length = 0;
113
- }
114
- finally {
115
- this._draining = false;
116
- }
117
- }
118
- /**
119
- * @internal Run one command's side effects: data-layer mutation, hook
120
- * firing, and routing to every registered query / system.
121
- */
122
- _executeCommand(cmd) {
123
- switch (cmd.kind) {
124
- case 0 /* CommandKind.CreateEntity */:
125
- this._entities.set(cmd.entity.eid, cmd.entity);
126
- return;
127
- case 1 /* CommandKind.Set */:
128
- cmd.entity._set(cmd.meta, cmd.props);
129
- return;
130
- case 2 /* CommandKind.Modified */:
131
- cmd.entity._modified(cmd.meta);
132
- return;
133
- case 3 /* CommandKind.Remove */:
134
- cmd.entity._remove(cmd.meta);
135
- return;
136
- case 4 /* CommandKind.Destroy */:
137
- cmd.entity._destroy();
138
- return;
139
- case 5 /* CommandKind.SetParent */:
140
- cmd.entity._setParent(cmd.parent);
141
- return;
142
- case 6 /* CommandKind.Attach */:
143
- cmd.entity._attach(cmd.meta, cmd.component);
144
- return;
145
- }
146
- }
147
- /**
148
- * @internal Distribute every registered system into its phase's `systems`
149
- * list. Called by {@link start}; idempotent so it can be re-run if the
150
- * pipeline is rebuilt.
151
- */
152
- _reindexSystems() {
153
- let _defaultPhase = this._pipeline.get("update");
154
- if (!_defaultPhase) {
155
- _defaultPhase = new Phase("update", this);
156
- this._pipeline.set(_defaultPhase.name, _defaultPhase);
157
- }
158
- const defaultPhase = _defaultPhase;
159
- this._queries.forEach((q) => {
160
- if (!(q instanceof System)) {
161
- return;
162
- }
163
- let phase = q._phase;
164
- if (typeof phase === "string") {
165
- phase = this._pipeline.get(phase);
166
- }
167
- phase = phase || defaultPhase;
168
- phase.systems.push(q);
169
- });
170
- this._pipeline.forEach((phase) => {
171
- console.log("Phase %s : %s", phase.name, phase.systems.map((s) => s.name).join(" -> "));
172
- });
173
- }
174
- /** @internal Append a command to the deferred-mode queue. */
175
- _enqueue(cmd) {
176
- this._commandQueue.push(cmd);
177
- }
178
- /** @internal Register a freshly created {@link Query} (called from its constructor). */
179
- _addQuery(q) {
180
- this._queries.push(q);
181
- }
182
- /** @internal Register a tick source with this world. */
183
- _registerTickSource(t) {
184
- this._tickSources.add(t);
185
- }
186
- /**
187
- * @internal Unregister a query and purge its membership from every entity.
188
- * Called by {@link Query.destroy}.
189
- */
190
- _removeQuery(q) {
191
- const idx = this._queries.indexOf(q);
192
- if (idx !== -1) {
193
- this._queries.splice(idx, 1);
194
- }
195
- this._entities.forEach((e) => e._purgeQuery(q));
196
- }
197
- /** @internal Remove an entity from the world's entity map (called by `Entity._destroy`). */
198
- _unregisterEntity(entity) {
199
- this._entities.delete(entity.eid);
200
- }
201
- /** Read-only view of the live entities, keyed by entity id. */
202
- get entities() {
203
- return this._entities;
204
- }
205
- /** Read-only view of every registered query (includes systems). */
206
- get queries() {
207
- return this._queries;
208
- }
209
- /**
210
- * `true` while the world is in deferred mode — entity mutations are queued
211
- * rather than applied inline. Equivalent to "the queue depth is non-zero or
212
- * the world is currently draining".
213
- */
214
- get deferred() {
215
- return this._deferredDepth > 0 || this._draining;
216
- }
217
- /**
218
- * Enter deferred mode. Mutations made until the matching {@link endDefer}
219
- * are queued instead of executing inline.
220
- *
221
- * Nested `beginDefer` / `endDefer` pairs are allowed; only the outermost
222
- * `endDefer` triggers a queue drain.
223
- */
224
- beginDefer() {
225
- this._deferredDepth++;
226
- }
227
- /**
228
- * Leave deferred mode. When the depth returns to zero the world drains the
229
- * command queue (firing hooks and routing enter / exit / update events).
230
- */
231
- endDefer() {
232
- this._deferredDepth--;
233
- this.flush();
234
- }
235
- /**
236
- * Run `fn` inside a deferred scope. Equivalent to
237
- * `beginDefer(); try { fn(); } finally { endDefer(); }`.
238
- *
239
- * @param fn - Callback executed in deferred mode.
240
- */
241
- defer(fn) {
242
- this.beginDefer();
243
- try {
244
- fn();
245
- }
246
- finally {
247
- this.endDefer();
248
- }
249
- }
250
- /**
251
- * Drain any commands queued at the top level (depth 0).
252
- *
253
- * Call between phases or after batch-loading network snapshots to surface
254
- * accumulated mutations (firing hooks and routing enter / exit / update)
255
- * before the next read or system run.
256
- */
257
- flush() {
258
- if (this._deferredDepth === 0) {
259
- this._processCommandQueue();
260
- }
261
- }
262
- /**
263
- * Pre-register a `componentName → typeId` mapping without binding a class.
264
- *
265
- * Useful when network messages refer to components by type id and the
266
- * corresponding class may be registered later. Call this **before**
267
- * {@link registerComponent} so the class picks up the server-assigned id
268
- * rather than a locally generated one.
269
- *
270
- * @param componentName - String name used in network payloads.
271
- * @param type - Numeric type id assigned by the server.
272
- */
273
- registerComponentType(componentName, type) {
274
- this._componentNameTypeMap.set(componentName, type);
275
- }
276
- registerComponent(ComponentClass, typeOrComponentName, componentName) {
277
- if (this._componentRegistrationDisabled) {
278
- throw "World component registartion is disabled";
279
- }
280
- let type = undefined;
281
- if (typeof typeOrComponentName === "number") {
282
- type = typeOrComponentName;
283
- }
284
- else if (typeof typeOrComponentName === "string") {
285
- componentName = typeOrComponentName;
286
- }
287
- componentName = componentName || ComponentClass.name;
288
- let local = false;
289
- if (type === undefined) {
290
- type = this._componentNameTypeMap.get(componentName);
291
- if (type === undefined) {
292
- type = this._localComponentCounter++;
293
- local = true;
294
- }
295
- }
296
- let meta = this._tryGetComponentMeta(ComponentClass);
297
- if (meta) {
298
- if (local) {
299
- this._localComponentCounter--;
300
- }
301
- throw `Trying to register ${componentName} with type=${type} which is already registered to ${meta.componentName}`;
302
- }
303
- this.registerComponentType(componentName, type);
304
- meta = new ComponentMeta(ComponentClass, type, componentName);
305
- Object.defineProperty(ComponentClass, this.worldKey, {
306
- value: meta,
307
- enumerable: false,
308
- });
309
- this._Type2Meta.set(type, meta);
310
- console.log("Registered component %s with type=%d as %s component", componentName, type, local ? "local" : "networked");
311
- return meta;
312
- }
313
- /** @internal Return registered metadata for this world without throwing. */
314
- _tryGetComponentMeta(typeOrClass) {
315
- if (typeof typeOrClass === "function") {
316
- return typeOrClass[this.worldKey];
317
- }
318
- return this._Type2Meta.get(typeOrClass);
319
- }
320
- /**
321
- * Look up the {@link ComponentMeta} for a registered component.
322
- *
323
- * @param typeOrClass - Component class or numeric type id.
324
- * @returns The corresponding meta record.
325
- * @throws When no component with that class or type id has been registered.
326
- */
327
- getComponentMeta(typeOrClass) {
328
- const meta = this._tryGetComponentMeta(typeOrClass);
329
- if (!meta) {
330
- throw `unregistered component meta for component type or class '${typeOrClass}'`;
331
- }
332
- return meta;
333
- }
334
- /**
335
- * Resolve a component class or type id to its numeric type id.
336
- *
337
- * @param typeOrClass - Component class or numeric type id.
338
- * @returns The numeric type id.
339
- */
340
- getComponentType(typeOrClass) {
341
- if (typeof typeOrClass === "function") {
342
- return this.getComponentMeta(typeOrClass).type;
343
- }
344
- return typeOrClass;
345
- }
346
- /**
347
- * Return the {@link Hook} for a component class.
348
- *
349
- * Hooks let you react to component lifecycle events (add / remove / set)
350
- * without building a full {@link System}. The same hook is returned on every
351
- * call — handlers stack on the underlying meta record.
352
- *
353
- * ```ts
354
- * world.hook(Sprite)
355
- * .onAdd((entity, c) => c.initialize(scene, entity))
356
- * .onRemove((entity, c) => c.destroy(scene, entity));
357
- * ```
358
- *
359
- * @param C - Component class.
360
- * @returns The hook bound to that component type.
361
- */
362
- hook(C) {
363
- return this.getComponentMeta(C);
364
- }
365
- /**
366
- * Declare a group of mutually exclusive components.
367
- *
368
- * Adding any component in the group to an entity that already has another
369
- * member of the group automatically removes the previous member. Members
370
- * not in the group are unaffected.
371
- *
372
- * ```ts
373
- * world.setExclusiveComponents(Walking, Running, Idle);
374
- * entity.add(Walking);
375
- * entity.add(Running); // Walking is removed automatically
376
- * ```
377
- *
378
- * Each call defines one independent group. A component may belong to at
379
- * most one group at a time; calling {@link setExclusiveComponents} with the
380
- * same class again overwrites its group. Safe to call before or after
381
- * {@link start}.
382
- *
383
- * @param components - Two or more component classes that cannot coexist.
384
- * @throws When any class has not been registered.
385
- */
386
- setExclusiveComponents(...components) {
387
- const metas = components.map((C) => this.getComponentMeta(C));
388
- for (let i = 0; i < metas.length; i++) {
389
- metas[i]._exclusive = metas.filter((_, j) => j !== i);
390
- }
391
- }
392
- /**
393
- * Set the starting value of the auto-incrementing entity id counter.
394
- *
395
- * Must be called **before** {@link start} (or
396
- * {@link disableComponentRegistration}). Useful when the world runs
397
- * alongside a server that owns a different id range — locally created
398
- * client entities can start at a high offset to avoid collisions with
399
- * server-assigned ids.
400
- *
401
- * @param min - First id assigned by {@link entity}.
402
- * @throws When called after registration has been disabled.
403
- */
404
- setEntityIdRange(min) {
405
- if (this._componentRegistrationDisabled) {
406
- throw "setEntityIdRange must be called before component registration is disabled";
407
- }
408
- this._eidCounter = min;
409
- }
410
- /**
411
- * Return the entity with id `eid`, creating it if it does not yet exist.
412
- *
413
- * Used by networking code to materialise server-assigned entities:
414
- *
415
- * ```ts
416
- * const e = world.getOrCreateEntity(snapshot.eid, (e) => {
417
- * networkEntities.add(e);
418
- * });
419
- * e.add(snapshot.type);
420
- * ```
421
- *
422
- * @param eid - Entity id to look up or create.
423
- * @param onCreateCallback - Optional callback invoked only when a new
424
- * entity is created, before it is returned. Use it to initialise
425
- * bookkeeping (e.g. tracking it in a local set).
426
- * @returns The existing or newly created entity.
427
- */
428
- getOrCreateEntity(eid, onCreateCallback) {
429
- let e = this._entities.get(eid);
430
- if (!e) {
431
- e = new Entity(this, eid);
432
- this._entities.set(eid, e);
433
- if (onCreateCallback) {
434
- onCreateCallback(e);
435
- }
436
- }
437
- return e;
438
- }
439
- entity(id) {
440
- if (id === undefined) {
441
- const eid = this._eidCounter++;
442
- const e = new Entity(this, eid);
443
- if (this.deferred) {
444
- this._enqueue({ kind: 0 /* CommandKind.CreateEntity */, entity: e });
445
- }
446
- else {
447
- this._entities.set(eid, e);
448
- }
449
- return e;
450
- }
451
- return this._entities.get(id);
452
- }
453
- /**
454
- * Destroy every entity currently tracked by the world.
455
- *
456
- * Triggers all `onRemove` hooks and `exit` callbacks. Useful when
457
- * transitioning between game sessions or resetting to a clean state.
458
- */
459
- clearAllEntities() {
460
- this._entities.forEach((e) => {
461
- e.destroy();
462
- });
463
- this.flush();
464
- }
465
- /**
466
- * Create, register, and return a new {@link System}, ready for fluent
467
- * configuration.
468
- *
469
- * ```ts
470
- * world.system("Render")
471
- * .phase("update")
472
- * .requires(Position, Sprite)
473
- * .enter([Sprite], (e, [sprite]) => sprite.initialize(scene))
474
- * .each([Position, Sprite], (e, [pos, sprite]) => sprite.draw(pos.x, pos.y));
475
- * ```
476
- *
477
- * @param name - Unique display name for the system.
478
- * @returns The new system.
479
- */
480
- system(name) {
481
- return new System(name, this);
482
- }
483
- /**
484
- * Create, register, and return a standalone {@link Query}, ready for fluent
485
- * configuration.
486
- *
487
- * Unlike a {@link System}, a standalone query has no phase and no per-tick
488
- * callbacks — it is a reactive entity set that can be read at any time. It
489
- * can also be created **after** {@link start}; existing matched entities
490
- * are backfilled immediately.
491
- *
492
- * ```ts
493
- * const enemies = world.query("Enemies")
494
- * .requires(Enemy, Health)
495
- * .enter((e) => console.log("enemy spawned", e.eid));
496
- *
497
- * world.start();
498
- * // enemies.entities is kept up-to-date automatically
499
- * ```
500
- *
501
- * @param name - Unique display name for the query.
502
- * @returns The new query.
503
- */
504
- query(name) {
505
- return new Query(name, this);
506
- }
507
- filter(q, _guaranteed) {
508
- return new Filter(this, q);
509
- }
510
- /**
511
- * Add a named phase to the update pipeline.
512
- *
513
- * Phases are executed in insertion order when {@link runPhase} or
514
- * {@link progress} is called. Systems join a phase via {@link System.phase}.
515
- *
516
- * ```ts
517
- * const preUpdate = world.addPhase("preupdate");
518
- * const update = world.addPhase("update");
519
- * const send = world.addPhase("send");
520
- * ```
521
- *
522
- * @param name - Unique phase name. Systems can reference it by this string.
523
- * @returns The new phase.
524
- */
525
- addPhase(name) {
526
- const phase = new Phase(name, this);
527
- this._pipeline.set(name, phase);
528
- return phase;
529
- }
530
- /**
531
- * Prevent any further calls to {@link registerComponent}.
532
- *
533
- * Called automatically by {@link start}. Call directly if you want to lock
534
- * registration before the rest of the systems are wired up.
535
- */
536
- disableComponentRegistration() {
537
- this._componentRegistrationDisabled = true;
538
- }
539
- /**
540
- * Freeze component registration and prepare the world for running.
541
- *
542
- * Distributes every system registered so far into its phase (defaulting to
543
- * `"update"`) and logs the phase → system order to the console. Systems
544
- * and queries can still be created after this call — standalone queries
545
- * backfill existing matched entities immediately.
546
- *
547
- * Call once before the first {@link runPhase} / {@link progress}.
548
- */
549
- start() {
550
- this._componentRegistrationDisabled = true;
551
- this._reindexSystems();
552
- }
553
- /**
554
- * Open a new frame and evaluate every registered tick source once.
555
- *
556
- * Call this before one or more {@link runPhase} calls when manually driving
557
- * phases. {@link progress} wraps this automatically for the full pipeline.
558
- *
559
- * @param delta - Milliseconds elapsed since the previous frame.
560
- * @throws When a frame is already open.
561
- */
562
- beginFrame(delta) {
563
- if (this._frameInProgress) {
564
- throw "endFrame() not called before beginFrame()";
565
- }
566
- this._frameInProgress = true;
567
- this._frameCounter++;
568
- this.flush();
569
- this._tickSources.forEach((t) => t._evalTick(delta, this._frameCounter));
570
- }
571
- /**
572
- * Close the current frame.
573
- *
574
- * @throws When no frame is currently open.
575
- */
576
- endFrame() {
577
- if (!this._frameInProgress) {
578
- throw "beginFrame() not called before endFrame()";
579
- }
580
- this._frameInProgress = false;
581
- }
582
- /**
583
- * Execute every system in `phase` within the current frame.
584
- *
585
- * Pending top-level mutations are drained before the first system runs so
586
- * each system observes a consistent world. Each system body executes in a
587
- * deferred scope; mutations made by callbacks land in the world queue and
588
- * are processed before the next system runs.
589
- *
590
- * `runPhase` is safe to call re-entrantly from a system body: it reuses the
591
- * frame opened by {@link beginFrame} and does not advance `_frameCounter` or
592
- * re-evaluate tick sources.
593
- *
594
- * @param phase - Phase reference returned from {@link addPhase}.
595
- * @param now - Absolute timestamp in milliseconds (e.g. `Date.now()`).
596
- * @param delta - Milliseconds elapsed since the previous tick.
597
- * @throws When called outside an open frame.
598
- */
599
- runPhase(phase, now, delta) {
600
- if (!this._frameInProgress) {
601
- throw "runPhase() called outside a frame — call beginFrame() first";
602
- }
603
- this.flush();
604
- phase.systems.forEach((s) => {
605
- s._run(now, delta);
606
- });
607
- }
608
- /**
609
- * Run every phase in the pipeline in registration order.
610
- *
611
- * Equivalent to `beginFrame(delta)`, calling {@link runPhase} for each
612
- * phase, then {@link endFrame}. All registered tick sources are evaluated
613
- * once up front for the whole frame, and the frame is closed in a `finally`
614
- * block if a system throws.
615
- *
616
- * @param now - Absolute timestamp in milliseconds (e.g. `Date.now()`).
617
- * @param delta - Milliseconds elapsed since the previous tick.
618
- */
619
- progress(now, delta) {
620
- this.beginFrame(delta);
621
- try {
622
- this._pipeline.forEach((phase) => {
623
- this.runPhase(phase, now, delta);
624
- });
625
- }
626
- finally {
627
- this.endFrame();
628
- }
629
- }
630
- }
631
- //# sourceMappingURL=world.js.map
package/dist/world.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"world.js","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,aAAa,EAAQ,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAU,KAAK,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAC;AAElE;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,KAAK;IAqChB;QApCA,4DAA4D;QACpD,cAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,kFAAkF;QAC1E,aAAQ,GAAY,EAAE,CAAC;QAE/B,iDAAiD;QACzC,eAAU,GAAG,IAAI,QAAQ,EAAiB,CAAC;QACnD,8EAA8E;QACtE,0BAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1D,qFAAqF;QAC7E,2BAAsB,GAAG,mBAAmB,CAAC;QACrD,qGAAqG;QAC7F,mCAA8B,GAAG,KAAK,CAAC;QAE/C,yFAAyF;QACjF,gBAAW,GAAG,CAAC,CAAC;QAExB,oEAAoE;QAC5D,kBAAa,GAAc,EAAE,CAAC;QACtC,oEAAoE;QAC5D,mBAAc,GAAG,CAAC,CAAC;QAC3B,oGAAoG;QAC5F,cAAS,GAAG,KAAK,CAAC;QAE1B,yFAAyF;QAClF,cAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;QAC5C,mEAAmE;QAC3D,iBAAY,GAAqB,IAAI,GAAG,EAAE,CAAC;QACnD,2EAA2E;QACpE,kBAAa,GAAG,CAAC,CAAC;QACzB,mEAAmE;QAC3D,qBAAgB,GAAG,KAAK,CAAC;QAEjC,gFAAgF;QAChE,aAAQ,GAAG,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAG/E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACK,oBAAoB;QAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,GAAY;QAClC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB;gBACE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrC,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClC,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,OAAO;QACX,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,eAAe;QACrB,IAAI,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,YAAY,GAAG,aAAa,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,CAAC,MAA2B,CAAC;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,GAAG,KAAK,IAAI,YAAY,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6DAA6D;IACtD,QAAQ,CAAC,GAAY;QAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,wFAAwF;IACjF,SAAS,CAAC,CAAQ;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,wDAAwD;IACjD,mBAAmB,CAAC,CAAc;QACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,CAAQ;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,4FAA4F;IACrF,iBAAiB,CAAC,MAAc;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,+DAA+D;IAC/D,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAgB,CAAC;IAC/B,CAAC;IAED,mEAAmE;IACnE,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACI,UAAU;QACf,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,EAAc;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,EAAE,EAAE,CAAC;QACP,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK;QACV,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACI,qBAAqB,CAAC,aAAqB,EAAE,IAAY;QAC9D,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IA+BM,iBAAiB,CACtB,cAA8B,EAC9B,mBAAqC,EACrC,aAAsB;QAEtB,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACxC,MAAM,0CAA0C,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,GAAuB,SAAS,CAAC;QAEzC,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,GAAG,mBAAmB,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YACnD,aAAa,GAAG,mBAAmB,CAAC;QACtC,CAAC;QAED,aAAa,GAAG,aAAa,IAAI,cAAc,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACrC,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,CAAC;YACD,MAAM,sBAAsB,aAAa,cAAc,IAAI,mCAAmC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrH,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,aAAa,CAAC,cAAc,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE;YACnD,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,aAAa,EACb,IAAI,EACJ,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAC9B,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IACrE,oBAAoB,CAAC,WAAiC;QAC3D,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;YACtC,OAAQ,WAAmB,CAAC,IAAI,CAAC,QAAQ,CAA8B,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,WAAiC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,4DAA4D,WAAW,GAAG,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,WAAiC;QACvD,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,IAAI,CAA2B,CAAI;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAQ,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,sBAAsB,CAAC,GAAG,UAA4B;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACI,gBAAgB,CAAC,GAAW;QACjC,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACxC,MAAM,2EAA2E,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACzB,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACI,iBAAiB,CAAC,GAAW,EAAE,gBAAsC;QAC1E,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAoBM,MAAM,CAAC,EAAW;QACvB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,kCAA0B,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACI,gBAAgB;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,KAAK,CAAC,IAAY;QACvB,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IA+BM,MAAM,CAAC,CAAW,EAAE,WAAuC;QAChE,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,QAAQ,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACI,4BAA4B;QACjC,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK;QACV,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;;;OAQG;IACI,UAAU,CAAC,KAAa;QAC7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,2CAA2C,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACI,QAAQ;QACb,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,2CAA2C,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAE,KAAa;QACvD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,6DAA6D,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,KAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,GAAW,EAAE,KAAa;QACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}