@typeonce/ritmo 0.8.0 → 0.9.0

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 (117) hide show
  1. package/README.md +3 -2
  2. package/dist/Clock.d.ts +19 -4
  3. package/dist/Clock.d.ts.map +1 -1
  4. package/dist/Clock.js +18 -2
  5. package/dist/Clock.js.map +1 -1
  6. package/dist/Command.d.ts +101 -45
  7. package/dist/Command.d.ts.map +1 -1
  8. package/dist/Command.js +22 -4
  9. package/dist/Command.js.map +1 -1
  10. package/dist/Debug.d.ts +66 -8
  11. package/dist/Debug.d.ts.map +1 -1
  12. package/dist/Descriptor.d.ts +27 -9
  13. package/dist/Descriptor.d.ts.map +1 -1
  14. package/dist/Descriptor.js +13 -9
  15. package/dist/Descriptor.js.map +1 -1
  16. package/dist/Entity.d.ts +15 -8
  17. package/dist/Entity.d.ts.map +1 -1
  18. package/dist/Entity.js.map +1 -1
  19. package/dist/FixedLoop.d.ts +106 -0
  20. package/dist/FixedLoop.d.ts.map +1 -0
  21. package/dist/FixedLoop.js +97 -0
  22. package/dist/FixedLoop.js.map +1 -0
  23. package/dist/HostClock.d.ts +1 -1
  24. package/dist/HostClock.d.ts.map +1 -1
  25. package/dist/HostClock.js +2 -1
  26. package/dist/HostClock.js.map +1 -1
  27. package/dist/Machine.d.ts +4 -1
  28. package/dist/Machine.d.ts.map +1 -1
  29. package/dist/Machine.js +4 -1
  30. package/dist/Machine.js.map +1 -1
  31. package/dist/Query.d.ts +52 -10
  32. package/dist/Query.d.ts.map +1 -1
  33. package/dist/Query.js +2 -1
  34. package/dist/Query.js.map +1 -1
  35. package/dist/Relation.d.ts +5 -14
  36. package/dist/Relation.d.ts.map +1 -1
  37. package/dist/Relation.js +0 -32
  38. package/dist/Relation.js.map +1 -1
  39. package/dist/Runtime.d.ts +58 -15
  40. package/dist/Runtime.d.ts.map +1 -1
  41. package/dist/Runtime.js +288 -70
  42. package/dist/Runtime.js.map +1 -1
  43. package/dist/Schedule.d.ts +24 -15
  44. package/dist/Schedule.d.ts.map +1 -1
  45. package/dist/Schedule.js +2 -1
  46. package/dist/Schedule.js.map +1 -1
  47. package/dist/Schema.d.ts +98 -29
  48. package/dist/Schema.d.ts.map +1 -1
  49. package/dist/Schema.js +4 -4
  50. package/dist/Schema.js.map +1 -1
  51. package/dist/Snapshot.d.ts +76 -1
  52. package/dist/Snapshot.d.ts.map +1 -1
  53. package/dist/Snapshot.js +42 -1
  54. package/dist/Snapshot.js.map +1 -1
  55. package/dist/System.d.ts +68 -24
  56. package/dist/System.d.ts.map +1 -1
  57. package/dist/System.js.map +1 -1
  58. package/dist/index.d.ts +4 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +4 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/internal/cells.d.ts +2 -0
  63. package/dist/internal/cells.d.ts.map +1 -1
  64. package/dist/internal/cells.js +34 -8
  65. package/dist/internal/cells.js.map +1 -1
  66. package/dist/internal/debug.d.ts +3 -0
  67. package/dist/internal/debug.d.ts.map +1 -1
  68. package/dist/internal/debug.js +83 -15
  69. package/dist/internal/debug.js.map +1 -1
  70. package/dist/internal/fragments.d.ts +2 -6
  71. package/dist/internal/fragments.d.ts.map +1 -1
  72. package/dist/internal/fragments.js +25 -2
  73. package/dist/internal/fragments.js.map +1 -1
  74. package/dist/internal/game.d.ts +2 -0
  75. package/dist/internal/game.d.ts.map +1 -1
  76. package/dist/internal/game.js +16 -3
  77. package/dist/internal/game.js.map +1 -1
  78. package/dist/internal/queries.d.ts.map +1 -1
  79. package/dist/internal/queries.js +27 -18
  80. package/dist/internal/queries.js.map +1 -1
  81. package/dist/internal/relations.d.ts +10 -0
  82. package/dist/internal/relations.d.ts.map +1 -0
  83. package/dist/internal/relations.js +32 -0
  84. package/dist/internal/relations.js.map +1 -0
  85. package/dist/internal/streams.d.ts +2 -0
  86. package/dist/internal/streams.d.ts.map +1 -1
  87. package/dist/internal/streams.js +10 -0
  88. package/dist/internal/streams.js.map +1 -1
  89. package/dist/internal/world.d.ts +7 -1
  90. package/dist/internal/world.d.ts.map +1 -1
  91. package/dist/internal/world.js +53 -3
  92. package/dist/internal/world.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/Clock.ts +29 -4
  95. package/src/Command.ts +161 -67
  96. package/src/Debug.ts +61 -9
  97. package/src/Descriptor.ts +43 -17
  98. package/src/Entity.ts +16 -9
  99. package/src/FixedLoop.ts +218 -0
  100. package/src/HostClock.ts +2 -1
  101. package/src/Machine.ts +4 -1
  102. package/src/Query.ts +47 -10
  103. package/src/Relation.ts +5 -67
  104. package/src/Runtime.ts +345 -85
  105. package/src/Schedule.ts +31 -19
  106. package/src/Schema.ts +118 -35
  107. package/src/Snapshot.ts +90 -2
  108. package/src/System.ts +76 -23
  109. package/src/index.ts +4 -0
  110. package/src/internal/cells.ts +42 -10
  111. package/src/internal/debug.ts +84 -15
  112. package/src/internal/fragments.ts +23 -3
  113. package/src/internal/game.ts +19 -3
  114. package/src/internal/queries.ts +28 -2
  115. package/src/internal/relations.ts +52 -0
  116. package/src/internal/streams.ts +11 -0
  117. package/src/internal/world.ts +60 -4
package/README.md CHANGED
@@ -14,7 +14,7 @@ pnpm add @typeonce/ritmo
14
14
  ```ts
15
15
  import { Descriptor, Schema } from "@typeonce/ritmo"
16
16
 
17
- const Position = Descriptor.Component<{ x: number; y: number }>()("Position")
17
+ const Position = Descriptor.Component<{ x: number; y: number }>()("Example/Position")
18
18
  const Game = Schema.bind(Schema.fragment({ components: { Position } }))
19
19
  ```
20
20
 
@@ -23,9 +23,10 @@ Modules are also importable by path, for example `@typeonce/ritmo/Result`.
23
23
  Related packages, released together with the same version:
24
24
 
25
25
  - [`@typeonce/ritmo-math`](https://www.npmjs.com/package/@typeonce/ritmo-math): validated vectors, sizes, and bounding boxes
26
- - [`@typeonce/ritmo-browser`](https://www.npmjs.com/package/@typeonce/ritmo-browser): fixed-step loop and keyboard actions
26
+ - [`@typeonce/ritmo-browser`](https://www.npmjs.com/package/@typeonce/ritmo-browser): animation-frame ticks for the fixed-step loop, keyboard, pointer, and touch input
27
27
  - [`@typeonce/ritmo-render`](https://www.npmjs.com/package/@typeonce/ritmo-render): entity-to-node sync for any renderer
28
28
  - [`@typeonce/ritmo-pixi`](https://www.npmjs.com/package/@typeonce/ritmo-pixi): Pixi container adapter for the render-node registry
29
29
  - [`@typeonce/ritmo-devtools`](https://www.npmjs.com/package/@typeonce/ritmo-devtools): headless debug sessions and trace reports
30
+ - [`@typeonce/oxlint-plugin-ritmo`](https://www.npmjs.com/package/@typeonce/oxlint-plugin-ritmo): oxlint rules that keep simulation code deterministic and headless
30
31
 
31
32
  Source: https://github.com/typeonce-dev/ritmo
package/dist/Clock.d.ts CHANGED
@@ -9,7 +9,8 @@
9
9
  * - `Clock.system(Game, { name, resource, hold })` advances it every tick:
10
10
  * `step + 1` and `dt = 1/hz`, or `dt = 0` while a `hold` condition passes.
11
11
  * - `Clock.duration(step, 0.5)` is a span in whole steps; `Clock.every(t, d)`
12
- * is true on the step each period begins; `Clock.elapsed(t)` is exact.
12
+ * is true on the step each period begins after the start (steps `d`,
13
+ * `2d`, ...); `Clock.elapsed(t)` is exact.
13
14
  *
14
15
  * Time is counted in steps, never accumulated in floating point: elapsed
15
16
  * seconds are `step / hz`.
@@ -20,7 +21,7 @@
20
21
  * const Time = Clock.resource("Game/Time", step)
21
22
  * const Game = Schema.bind(Schema.fragment({ resources: { Time } }))
22
23
  * const AdvanceTime = Clock.system(Game, { name: "Game/AdvanceTime", resource: Time, hold: [paused] })
23
- * const runtime = Game.Runtime.make({ services, resources: { Time: Clock.start(step) } })
24
+ * const runtime = Game.Runtime.make({ services, resources: { Time: Clock.start(step) } }).value
24
25
  * ```
25
26
  *
26
27
  * @module Clock
@@ -170,16 +171,30 @@ export type ValidDuration<Hz extends number, Seconds extends number> = number ex
170
171
  * rounded to the nearest whole step (half up), so `Clock.duration(Clock.hz(60), 0.025)`
171
172
  * is 2 steps (1.5 rounds up). Shorter than one step is a compile error
172
173
  * ("0.001s is shorter than one step (1/60s)"). For seconds read from data,
173
- * use `durationRaw`.
174
+ * use `durationRaw`; for a count of steps, `durationOfSteps`.
174
175
  */
175
176
  export declare const duration: <Hz extends number, const Seconds extends number>(step: Step<Hz>, seconds: ValidDuration<Hz, Seconds>) => Duration<Hz>;
176
177
  /** Seconds from data as whole steps of `step`, the same rules as `duration`, as a `Result`. */
177
178
  export declare const durationRaw: <Hz extends number>(step: Step<Hz>, seconds: number) => Result.Result<Duration<Hz>, InvalidDuration>;
179
+ type StepsMessage = "Clock.durationOfSteps needs a positive whole number of steps";
180
+ /** `N` when it is a positive whole number (or a computed `number`); otherwise the message. */
181
+ export type ValidSteps<N extends number> = number extends N ? N : `${N}` extends `-${string}` | `${string}.${string}` | `${string}e${string}` | "0" ? StepsMessage : N;
182
+ /**
183
+ * A whole number of steps of `step` as a duration: `Clock.durationOfSteps(Clock.hz(60), 3)`.
184
+ * Use it when the length is counted in steps (an animation of 3 frames, a
185
+ * cooldown stored as steps); use `duration` for literal seconds and
186
+ * `durationRaw` for seconds from data. A count cannot round, so nothing can
187
+ * fail for a positive whole number: a literal zero, negative, or fraction is
188
+ * a compile error, and a computed one throws.
189
+ */
190
+ export declare const durationOfSteps: <Hz extends number, const N extends number>(step: Step<Hz>, steps: ValidSteps<N>) => Duration<Hz>;
178
191
  /** The whole steps a duration spans. */
179
192
  export declare const steps: (duration: Duration) => number;
180
193
  /**
181
194
  * Whether a period of `duration` begins on this tick: the clock advanced
182
- * (not held) to a step that is a multiple of the period. False while held.
195
+ * (not held) to a step that is a multiple of the period. False while held,
196
+ * and on the first step (0), which no advance reached: the first period
197
+ * begins at step `duration`.
183
198
  */
184
199
  export declare const every: <Hz extends number>(time: Time<Hz>, duration: Duration<NoInfer<Hz>>) => boolean;
185
200
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../src/Clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../src/Clock.ts"],"names":[],"mappings":"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"}
package/dist/Clock.js CHANGED
@@ -88,7 +88,7 @@ const stepsOf = (hz, seconds) => {
88
88
  * rounded to the nearest whole step (half up), so `Clock.duration(Clock.hz(60), 0.025)`
89
89
  * is 2 steps (1.5 rounds up). Shorter than one step is a compile error
90
90
  * ("0.001s is shorter than one step (1/60s)"). For seconds read from data,
91
- * use `durationRaw`.
91
+ * use `durationRaw`; for a count of steps, `durationOfSteps`.
92
92
  */
93
93
  export const duration = (step, seconds) => {
94
94
  const steps = stepsOf(step.hz, seconds);
@@ -101,11 +101,27 @@ export const durationRaw = (step, seconds) => {
101
101
  const steps = stepsOf(step.hz, seconds);
102
102
  return steps.ok ? Result.success({ kind: "ClockDuration", steps: steps.value, hz: step.hz }) : steps;
103
103
  };
104
+ /**
105
+ * A whole number of steps of `step` as a duration: `Clock.durationOfSteps(Clock.hz(60), 3)`.
106
+ * Use it when the length is counted in steps (an animation of 3 frames, a
107
+ * cooldown stored as steps); use `duration` for literal seconds and
108
+ * `durationRaw` for seconds from data. A count cannot round, so nothing can
109
+ * fail for a positive whole number: a literal zero, negative, or fraction is
110
+ * a compile error, and a computed one throws.
111
+ */
112
+ export const durationOfSteps = (step, steps) => {
113
+ const count = steps;
114
+ if (!Number.isSafeInteger(count) || count <= 0)
115
+ throw new Error(`Clock.durationOfSteps needs a positive whole number of steps, got ${count}`);
116
+ return { kind: "ClockDuration", steps: count, hz: step.hz };
117
+ };
104
118
  /** The whole steps a duration spans. */
105
119
  export const steps = (duration) => duration.steps;
106
120
  /**
107
121
  * Whether a period of `duration` begins on this tick: the clock advanced
108
- * (not held) to a step that is a multiple of the period. False while held.
122
+ * (not held) to a step that is a multiple of the period. False while held,
123
+ * and on the first step (0), which no advance reached: the first period
124
+ * begins at step `duration`.
109
125
  */
110
126
  export const every = (time, duration) => time.dt > 0 && time.step % duration.steps === 0;
111
127
  //# sourceMappingURL=Clock.js.map
package/dist/Clock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Clock.js","sourceRoot":"","sources":["../src/Clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Clock.js","sourceRoot":"","sources":["../src/Clock.ts"],"names":[],"mappings":"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"}
package/dist/Command.d.ts CHANGED
@@ -65,6 +65,7 @@ import * as Entity from "./Entity.ts";
65
65
  import type * as EntityScope from "./EntityScope.ts";
66
66
  import type * as Relation from "./Relation.ts";
67
67
  import * as Result from "./Result.ts";
68
+ import type { ReadonlyValue } from "./Query.ts";
68
69
  import type { RequirementPair, Schema } from "./Schema.ts";
69
70
  /**
70
71
  * Type-level helpers for staged entity construction.
@@ -90,7 +91,7 @@ export declare namespace Draft {
90
91
  /**
91
92
  * A typed descriptor/value pair used by the flat command authoring APIs.
92
93
  */
93
- export type Entry<D extends Descriptor<"component", string, any>> = readonly [D, Descriptor.Value<D>];
94
+ export type Entry<D extends Descriptor<"component", string, any>> = readonly [D, ReadonlyValue<Descriptor.Value<D>>];
94
95
  /**
95
96
  * Extracts the component-descriptor union from a schema.
96
97
  */
@@ -117,10 +118,13 @@ type EntryValue<T> = [
117
118
  /**
118
119
  * Folds entries into the component proof of the resulting draft.
119
120
  */
120
- export type FoldEntries<Entries extends ReadonlyArray<SpawnEntry<any>>, P extends Entity.ComponentProof = {}> = number extends Entries["length"] ? P & MaybeEntries<EntryValue<Entries[number]>> : Entries extends readonly [
121
+ export type FoldEntries<Entries extends ReadonlyArray<SpawnEntry<any>>, P extends Entity.ComponentProof = {}> = Entries extends readonly [
121
122
  infer Head extends SpawnEntry<any>,
122
- ...infer Tail extends Array<SpawnEntry<any>>
123
- ] ? FoldEntries<Tail, Draft.InsertEntry<P, EntryValue<Head>>> : P;
123
+ ...infer Tail extends ReadonlyArray<SpawnEntry<any>>
124
+ ] ? FoldEntries<Tail, Draft.InsertEntry<P, EntryValue<Head>>> : Entries extends readonly [
125
+ ...infer Init extends ReadonlyArray<SpawnEntry<any>>,
126
+ infer Last extends SpawnEntry<any>
127
+ ] ? FoldEntries<Init, Draft.InsertEntry<P, EntryValue<Last>>> : number extends Entries["length"] ? P & MaybeEntries<EntryValue<Entries[number]>> : P;
124
128
  /** The proof of entries that may each be present: every component they can hold, optional. */
125
129
  type MaybeEntries<Entry> = {
126
130
  readonly [E in Entry as E extends readonly [infer D extends Descriptor<"component", string, any>, unknown] ? Descriptor.Name<D> : never]?: E extends readonly [infer D extends Descriptor<"component", string, any>, unknown] ? Descriptor.Value<D> : never;
@@ -136,9 +140,9 @@ export type EntryErrors<Entries extends ReadonlyArray<SpawnEntry<any>>> = {
136
140
  * The draft produced from `Entries`, wrapped in a `Result` exactly when at
137
141
  * least one entry is a `Result` and can therefore fail.
138
142
  */
139
- export type DraftFor<S extends Schema.Any, Entries extends ReadonlyArray<SpawnEntry<S>>, P extends Entity.ComponentProof, Root> = [Extract<Entries[number], {
143
+ export type DraftFor<S extends Schema.Any, Entries extends ReadonlyArray<SpawnEntry<S>>, P extends Entity.ComponentProof, Root, Relates = never> = [Extract<Entries[number], {
140
144
  readonly ok: boolean;
141
- }>] extends [never] ? Entity.EntityDraft<S, FoldEntries<Entries, P>, Root> : Result.Result<Entity.EntityDraft<S, FoldEntries<Entries, P>, Root>, EntryErrors<Entries>>;
145
+ }>] extends [never] ? Entity.EntityDraft<S, FoldEntries<Entries, P>, Root, Relates> : Result.Result<Entity.EntityDraft<S, FoldEntries<Entries, P>, Root, Relates>, EntryErrors<Entries>>;
142
146
  /**
143
147
  * A deferred world mutation.
144
148
  *
@@ -190,6 +194,12 @@ export interface InternalWorld<S extends Schema.Any> {
190
194
  * written when an inserted component would miss one it requires.
191
195
  */
192
196
  readonly insertComponents: (id: Entity.EntityId<S, any>, entries: ReadonlyArray<Entity.StagedComponent>) => void;
197
+ /**
198
+ * Reports a `despawn` or `remove` given a numeric id this run did not
199
+ * spawn: an id kept from an earlier run, or a raw id that erased types let
200
+ * through. The command is skipped.
201
+ */
202
+ readonly reportStaleTarget: (command: "despawn" | "remove", id: Entity.EntityId<S, any>) => void;
193
203
  /**
194
204
  * Attempts to attach one relation edge between two live entities.
195
205
  */
@@ -206,10 +216,11 @@ export interface InternalWorld<S extends Schema.Any> {
206
216
  /**
207
217
  * Creates a typed component entry.
208
218
  */
209
- export declare const entry: <D extends Descriptor<"component", string, any>>(descriptor: D, value: Descriptor.Value<D>) => Entry<D>;
219
+ export declare const entry: <D extends Descriptor<"component", string, any>>(descriptor: D, value: ReadonlyValue<Descriptor.Value<D>>) => Entry<D>;
210
220
  /**
211
221
  * Validates raw input through a constructed descriptor's own validator and
212
- * returns an entry result for `spawn(...)` / `insert(...)`.
222
+ * returns an entry result for `Game.Command.spawn(...)` / `extend(...)`.
223
+ * `commands.insert` takes valid entries only: check the result first.
213
224
  *
214
225
  * This is the one way to put unvalidated data on an entity: the descriptor
215
226
  * owns its validator (`Descriptor.ConstructedComponent(...)`, built with
@@ -237,13 +248,13 @@ export declare const entryRaw: <D extends DescriptorModule.ConstructedDescriptor
237
248
  * Use this while building what a spawn will hold. Use `commands.insert` to
238
249
  * add or replace components on an entity that already exists.
239
250
  */
240
- export declare const extend: <S extends Schema.Any, P extends Entity.ComponentProof, Root, const Entries extends ReadonlyArray<SpawnEntry<S>>>(draft: Entity.EntityDraft<S, P, Root>, ...entries: Entries) => DraftFor<S, Entries, P, Root>;
251
+ export declare const extend: <S extends Schema.Any, P extends Entity.ComponentProof, Root, const Entries extends ReadonlyArray<SpawnEntry<S>>, Relates = never>(draft: Entity.EntityDraft<S, P, Root, Relates>, ...entries: Entries) => DraftFor<S, Entries, P, Root, Relates>;
241
252
  /**
242
253
  * Starts a staged entity from component entries.
243
254
  *
244
255
  * Drafts are plain values: build them anywhere (including small factories),
245
256
  * then queue them with `commands.spawn(...)`. Entries may be `[Descriptor,
246
- * value]` pairs or results from `entryRaw(...)`; see `insert(...)` for how
257
+ * value]` pairs or results from `entryRaw(...)`; see `extend(...)` for how
247
258
  * failures are reported.
248
259
  *
249
260
  * @example
@@ -261,7 +272,7 @@ export declare const spawn: <S extends Schema.Any, Root = unknown, const Entries
261
272
  * Drafts stay pure: this only records intent so the runtime can attempt to
262
273
  * attach the relation when the spawn command is applied.
263
274
  */
264
- export declare const relate: <S extends Schema.Any, P extends Entity.ComponentProof, R extends Relation.Relation.Any, Root = unknown>(draft: Entity.EntityDraft<S, P, Root>, relation: R, target: Entity.EntityId<S, Root>) => Entity.EntityDraft<S, P, Root>;
275
+ export declare const relate: <S extends Schema.Any, P extends Entity.ComponentProof, R extends Relation.Relation.Any, Root = unknown, Relates = never>(draft: Entity.EntityDraft<S, P, Root, Relates>, relation: R, target: Entity.EntityId<S, Root>) => Entity.EntityDraft<S, P, Root, Relates | R>;
265
276
  /** One permission of `Game.System.commands(...)`: a kind of command, and what it may touch. */
266
277
  export interface Permission<out Kind extends PermissionKind, out Value> {
267
278
  readonly permission: Kind;
@@ -273,25 +284,25 @@ type ComponentDescriptor = Descriptor<"component", string, any>;
273
284
  * Allows `spawn` / `spawnIn` of drafts whose components are all among `components`.
274
285
  * Use it for entities the system creates; use `extend` on a draft to build one.
275
286
  */
276
- export declare const spawns: <const Components extends ReadonlyArray<ComponentDescriptor>>(...components: Components) => Permission<"spawns", Components[number]>;
287
+ export declare const spawns: <const Components extends readonly [ComponentDescriptor, ...ReadonlyArray<ComponentDescriptor>]>(...components: Components) => Permission<"spawns", Components[number]>;
277
288
  /**
278
289
  * Allows `insert(entity, [X, value])` with `X` among `components`: add or
279
290
  * replace at the next `applyDeferred()`. To change a value now, on an entity
280
291
  * you matched, write through a query (`Game.Query.write`) instead.
281
292
  */
282
- export declare const inserts: <const Components extends ReadonlyArray<ComponentDescriptor>>(...components: Components) => Permission<"inserts", Components[number]>;
293
+ export declare const inserts: <const Components extends readonly [ComponentDescriptor, ...ReadonlyArray<ComponentDescriptor>]>(...components: Components) => Permission<"inserts", Components[number]>;
283
294
  /** Allows `remove(entity, X)` with `X` among `components`. */
284
- export declare const removes: <const Components extends ReadonlyArray<ComponentDescriptor>>(...components: Components) => Permission<"removes", Components[number]>;
295
+ export declare const removes: <const Components extends readonly [ComponentDescriptor, ...ReadonlyArray<ComponentDescriptor>]>(...components: Components) => Permission<"removes", Components[number]>;
285
296
  /**
286
297
  * Allows `despawn(entity)` where `entity` comes from a query match proving one
287
298
  * of `components` (`match.entity`), never a raw id: the system can only
288
299
  * despawn what it has proven is, for example, an `Enemy`.
289
300
  */
290
- export declare const despawns: <const Components extends ReadonlyArray<ComponentDescriptor>>(...components: Components) => Permission<"despawns", Components[number]>;
301
+ export declare const despawns: <const Components extends readonly [ComponentDescriptor, ...ReadonlyArray<ComponentDescriptor>]>(...components: Components) => Permission<"despawns", Components[number]>;
291
302
  /** Allows `despawnScope(scope)` for this scope. */
292
303
  export declare const despawnsScope: <const Scope extends EntityScope.EntityScope.Any>(scope: Scope) => Permission<"despawnsScope", Scope>;
293
304
  /** Allows `relate`, `unrelate`, and `reorderChildren` for these relations. */
294
- export declare const relates: <const Relations extends ReadonlyArray<Relation.Relation.Any>>(...relations: Relations) => Permission<"relates", Relations[number]>;
305
+ export declare const relates: <const Relations extends readonly [Relation.Relation.Any, ...ReadonlyArray<Relation.Relation.Any>]>(...relations: Relations) => Permission<"relates", Relations[number]>;
295
306
  type PermissionValue<Permissions, Kind extends PermissionKind> = Permissions extends Permission<Kind, infer Value> ? Value : never;
296
307
  /**
297
308
  * The commands a system may queue, declared in its spec as
@@ -320,6 +331,10 @@ type Names<D> = D extends {
320
331
  } ? Name : never;
321
332
  /** Every key of every member of a union of proofs (a draft with a conditional entry is a union). */
322
333
  type AllKeys<P> = P extends unknown ? keyof P & string : never;
334
+ /** Relations staged on a draft need `relates`, like `commands.relate`. */
335
+ type DraftRelationsAllowed<Relates, Declared> = [
336
+ Exclude<Relates, Declared>
337
+ ] extends [never] ? unknown : Fix<`${Names<Exclude<Relates, Declared>>} is related by this draft but not declared in this system's commands: add it to Game.System.relates(...)`>;
323
338
  type DraftAllowed<P, Spawns> = [
324
339
  Exclude<AllKeys<P>, Names<Spawns>>
325
340
  ] extends [never] ? unknown : Fix<`${Exclude<AllKeys<P>, Names<Spawns>>} is not declared in this system's commands: add it to Game.System.spawns(...)`>;
@@ -329,51 +344,86 @@ type EntriesAllowed<Entries extends ReadonlyArray<readonly [ComponentDescriptor,
329
344
  type RemoveAllowed<D, Removes> = [
330
345
  D
331
346
  ] extends [Removes] ? unknown : Fix<`${Names<D>} is not declared in this system's commands: add it to Game.System.removes(...)`>;
332
- type DespawnAllowed<E, Despawns> = E extends {
347
+ /**
348
+ * Why each possible target of a despawn is not allowed (`never` when it is).
349
+ * Computed per member, so a target chosen from several queries
350
+ * (`cond ? a.entity : b.entity`) must pass for every one of them.
351
+ */
352
+ type DespawnRejections<E, Despawns> = E extends {
333
353
  readonly kind: "EntityRef" | "EntityMut";
334
- readonly __proves?: (_: never) => infer Proves;
335
- } ? [Extract<Proves, Despawns>] extends [never] ? Fix<`despawn needs an entity from a query proving ${Names<Despawns>} (declared in despawns)`> : unknown : E extends {
354
+ readonly __proves?: (_: infer Proves) => void;
355
+ } ? [Extract<Proves, Despawns>] extends [never] ? `despawn needs an entity from a query proving ${Names<Despawns>} (declared in despawns)` : never : E extends {
336
356
  readonly [spawnedTypeId]: (_: never) => infer Spawned;
337
- } ? [Extract<Spawned, Names<Despawns>>] extends [never] ? Fix<`despawn needs an entity spawned with ${Names<Despawns>} (declared in despawns)`> : unknown : Fix<`despawn needs an entity from a query proving ${Names<Despawns>} (declared in despawns), not a raw id: pass match.entity`>;
357
+ } ? [Extract<Spawned, Names<Despawns>>] extends [never] ? `despawn needs an entity spawned with ${Names<Despawns>} (declared in despawns)` : never : `despawn needs an entity from a query proving ${Names<Despawns>} (declared in despawns), not a raw id: pass match.entity`;
358
+ type DespawnAllowed<E, Despawns> = [
359
+ DespawnRejections<E, Despawns>
360
+ ] extends [never] ? unknown : Fix<DespawnRejections<E, Despawns>>;
338
361
  declare const spawnedTypeId: unique symbol;
339
362
  /**
340
363
  * The id `spawn` / `spawnIn` return: an `EntityId` that also records the
341
364
  * components its draft holds in every case, so the system that queued it can
342
365
  * `despawn` it before the next `applyDeferred()` (no query can match it yet).
366
+ * It is valid only in the run that spawned it: kept in a closure or a
367
+ * resource and passed to `despawn` / `remove` in a later run, the command is
368
+ * skipped and reported (the `stale-target` lint). Keep the entity id or a
369
+ * handle and resolve it again through a query instead.
343
370
  * Stored as a plain `EntityId`, it is a raw id again.
344
371
  */
345
372
  export type SpawnedId<S extends Schema.Any, Root, Components extends string> = Entity.EntityId<S, Root> & {
346
373
  readonly [spawnedTypeId]: (_: never) => Components;
347
374
  };
348
- /** The requirements (`[requirer, required]`) of the components in `Held` that `Held` lacks. */
349
- type MissingPairs<S extends Schema.Any, Held extends string> = Extract<Schema.Requires<S>, readonly [Held, string]> extends infer Pair ? Pair extends readonly [string, infer To extends string] ? To extends Held ? never : Pair : never : never;
350
375
  /** One message per missing requirement: `"Player requires Velocity"`. */
351
376
  type MissingMessages<Pairs> = Pairs extends readonly [infer From extends string, infer To extends string] ? `${From} requires ${To}` : never;
377
+ /** The requirements (`[requirer, required]`) of the components in `From` that `Held` lacks. */
378
+ type MissingPairsFrom<S extends Schema.Any, From extends string, Held extends string> = Extract<Schema.Requires<S>, readonly [From, string]> extends infer Pair ? Pair extends readonly [string, infer To extends string] ? To extends Held ? never : Pair : never : never;
352
379
  /**
353
- * Accepts a draft holding every requirement of every component it holds.
354
- * Direct requirements are enough: each required component must be held
355
- * too, with its own requirements.
380
+ * The requirements a draft may break. A draft's proof is a union of
381
+ * alternatives when an entry is conditional, and has optional keys for
382
+ * spread entries: in each alternative, every component it may hold needs
383
+ * every component it requires surely held. Direct requirements are enough:
384
+ * each required component must be held too, with its own requirements.
356
385
  */
357
- type DraftRequirementsMet<S extends Schema.Any, Held extends string> = [
358
- MissingPairs<S, Held>
359
- ] extends [never] ? unknown : Fix<`${MissingMessages<MissingPairs<S, Held>>}: add the missing entries to the draft`>;
360
- /** What an insert or remove target is known to hold: a query match's proof, or a `SpawnedId`'s draft. A raw id proves nothing. */
361
- type TargetHolds<E> = E extends {
386
+ type DraftViolations<S extends Schema.Any, P> = P extends unknown ? MissingPairsFrom<S, keyof P & string, RequiredKeys<P>> : never;
387
+ type DraftRequirementsMet<S extends Schema.Any, P> = [
388
+ DraftViolations<S, P>
389
+ ] extends [never] ? unknown : Fix<`${MissingMessages<DraftViolations<S, P>>}: add the missing entries to the draft`>;
390
+ /** What one possible target holds: a query match's proof, or a `SpawnedId`'s draft. A raw id proves nothing. */
391
+ type HeldBy<E> = E extends {
362
392
  readonly kind: "EntityRef" | "EntityMut";
363
- readonly __proves?: (_: never) => infer Proves;
393
+ readonly __proves?: (_: infer Proves) => void;
364
394
  } ? Names<Proves> : E extends {
365
395
  readonly [spawnedTypeId]: (_: never) => infer Spawned extends string;
366
396
  } ? Spawned : never;
367
- /** What a remove target is known to lack: its query's `without`. */
368
- type TargetLacks<E> = E extends {
397
+ /** What one possible target's query proves absent: its `without`. */
398
+ type LackedBy<E> = E extends {
369
399
  readonly kind: "EntityRef" | "EntityMut";
370
- readonly __lacks?: (_: never) => infer Lacks;
400
+ readonly __lacks?: (_: infer Lacks) => void;
371
401
  } ? Names<Lacks> : never;
402
+ /** The names in `All` that some member of `E` does not hold (or lack). */
403
+ type MissingFromHeld<E, All> = E extends unknown ? Exclude<All, HeldBy<E>> : never;
404
+ type MissingFromLacked<E, All> = E extends unknown ? Exclude<All, LackedBy<E>> : never;
405
+ /**
406
+ * What an insert or remove target is known to hold. For a target chosen
407
+ * from several queries (`cond ? a.entity : b.entity`), only what every one
408
+ * of them proves.
409
+ */
410
+ type TargetHolds<E> = Exclude<HeldBy<E>, MissingFromHeld<E, HeldBy<E>>>;
411
+ /** What a remove target is known to lack: its query's `without` (for several queries, what all of them exclude). */
412
+ type TargetLacks<E> = Exclude<LackedBy<E>, MissingFromLacked<E, LackedBy<E>>>;
372
413
  type EntryNames<Entries extends ReadonlyArray<readonly [ComponentDescriptor, unknown]>> = Names<Entries[number][0]>;
373
- /** Inserted components with requirements neither inserted alongside nor proven held by the target. */
414
+ /** The names one entry surely holds: none when it is conditional between descriptors. */
415
+ type SureEntryNames<Entry, All extends string = EntryNamesOf<Entry>> = Exclude<All, Entry extends unknown ? Exclude<All, EntryNamesOf<Entry>> : never>;
416
+ type EntryNamesOf<Entry> = Entry extends readonly [infer D, unknown] ? Names<D> : never;
417
+ /** The names surely inserted: fixed entries, not spread or conditional ones. */
418
+ type SurelyInserted<Entries> = Entries extends readonly [infer Head, ...infer Tail] ? SureEntryNames<Head> | SurelyInserted<Tail> : Entries extends readonly [...infer Init, infer Last] ? SureEntryNames<Last> | SurelyInserted<Init> : never;
419
+ /**
420
+ * Inserted components (any entry may be one) with requirements neither
421
+ * surely inserted alongside nor proven held by the target.
422
+ */
423
+ type InsertViolations<S extends Schema.Any, E, Entries extends ReadonlyArray<readonly [ComponentDescriptor, unknown]>> = MissingPairsFrom<S, EntryNames<Entries>, SurelyInserted<Entries> | TargetHolds<E>>;
374
424
  type InsertRequirementsMet<S extends Schema.Any, E, Entries extends ReadonlyArray<readonly [ComponentDescriptor, unknown]>> = [
375
- MissingPairs<S, EntryNames<Entries> | TargetHolds<E>> & readonly [EntryNames<Entries>, string]
376
- ] extends [never] ? unknown : Fix<`${MissingMessages<MissingPairs<S, EntryNames<Entries> | TargetHolds<E>> & readonly [EntryNames<Entries>, string]>}: insert it in the same call, or pass match.entity from a query that proves it`>;
425
+ InsertViolations<S, E, Entries>
426
+ ] extends [never] ? unknown : Fix<`${MissingMessages<InsertViolations<S, E, Entries>>}: insert it in the same call, or pass match.entity from a query that proves it`>;
377
427
  /**
378
428
  * Removing `Removed` is sound when every component that requires one of
379
429
  * them is removed in the same call or proven absent by the target's query
@@ -384,11 +434,14 @@ type RemoveViolations<S extends Schema.Any, E, Removed extends string> = Extract
384
434
  type RemoveRequirementsMet<S extends Schema.Any, E, Removed extends string> = [
385
435
  RemoveViolations<S, E, Removed>
386
436
  ] extends [never] ? unknown : Fix<RemoveViolations<S, E, Removed>>;
387
- /** A remove target: `match.entity`, or the id `spawn` returned in this run; never a raw id. */
388
- type RemoveTargetAllowed<S extends Schema.Any, Root, E> = E extends {
437
+ /** A remove target: `match.entity`, or the id `spawn` returned in this run; never a raw id, not even as one of several. */
438
+ type RemoveTargetRejections<S extends Schema.Any, Root, E> = E extends {
389
439
  readonly kind: "EntityRef" | "EntityMut";
390
440
  readonly id: Entity.EntityId<S, Root>;
391
- } ? unknown : E extends SpawnedId<S, Root, string> ? unknown : Fix<"remove needs an entity from a query (pass match.entity) or the id spawn returned in this run, not a raw id">;
441
+ } ? never : E extends SpawnedId<S, Root, string> ? never : "remove needs an entity from a query (pass match.entity) or the id spawn returned in this run, not a raw id";
442
+ type RemoveTargetAllowed<S extends Schema.Any, Root, E> = [
443
+ RemoveTargetRejections<S, Root, E>
444
+ ] extends [never] ? unknown : Fix<RemoveTargetRejections<S, Root, E>>;
392
445
  /** The transitive closure of the names `N` require (cycles stop). */
393
446
  type RequiredClosure<Pairs extends RequirementPair, N extends string, Seen extends string = never> = [
394
447
  Exclude<N, Seen>
@@ -422,7 +475,8 @@ type HeldNames<P> = Exclude<AllKeys<P>, MissingSomewhere<P, AllKeys<P>>>;
422
475
  * `spawn` needs `Game.System.spawns(...)` listing every component of the
423
476
  * draft, `insert` needs `inserts`, `remove` needs `removes`, `despawn` needs
424
477
  * `despawns` and an entity from a query proving one of them, `despawnScope`
425
- * needs `despawnsScope`, and relation edits need `relates`.
478
+ * needs `despawnsScope`, and relation edits need `relates`, including
479
+ * relations a spawned draft stages with `Game.Command.relate(...)`.
426
480
  *
427
481
  * Resource and event writes are not commands: they go through the
428
482
  * `writeResource(...)` / `writeEvent(...)` access a system declares.
@@ -434,13 +488,15 @@ export interface CommandsApi<S extends Schema.Any, Root = unknown, Spawns = neve
434
488
  * The draft must hold every component its components require
435
489
  * (`Schema.requires`); drafts are checked here, so a partial draft built
436
490
  * with `Game.Command.spawn(...)` and completed with `extend(...)` is fine.
491
+ * A component the draft may hold (a conditional or spread entry) needs
492
+ * what it requires surely held.
437
493
  */
438
- readonly spawn: [Spawns] extends [never] ? MethodNotDeclared<"spawn", "spawns"> : <P extends Entity.ComponentProof>(draft: Entity.EntityDraft<S, P, Root> & DraftAllowed<P, Spawns> & DraftRequirementsMet<S, HeldNames<P>>) => SpawnedId<S, Root, HeldNames<P>>;
494
+ readonly spawn: [Spawns] extends [never] ? MethodNotDeclared<"spawn", "spawns"> : <P extends Entity.ComponentProof, R = never>(draft: Entity.EntityDraft<S, P, Root, R> & DraftAllowed<P, Spawns> & DraftRequirementsMet<S, P> & DraftRelationsAllowed<R, Relates>) => SpawnedId<S, Root, HeldNames<P>>;
439
495
  /**
440
496
  * Queues an entity spawn owned by one lifetime scope (removed together
441
497
  * with `despawnScope(...)`). The draft is checked like `spawn(...)`.
442
498
  */
443
- readonly spawnIn: [Spawns] extends [never] ? MethodNotDeclared<"spawnIn", "spawns"> : <P extends Entity.ComponentProof>(scope: EntityScope.EntityScope<string, Root>, draft: Entity.EntityDraft<S, P, Root> & DraftAllowed<P, Spawns> & DraftRequirementsMet<S, HeldNames<P>>) => SpawnedId<S, Root, HeldNames<P>>;
499
+ readonly spawnIn: [Spawns] extends [never] ? MethodNotDeclared<"spawnIn", "spawns"> : <P extends Entity.ComponentProof, R = never>(scope: EntityScope.EntityScope<string, Root>, draft: Entity.EntityDraft<S, P, Root, R> & DraftAllowed<P, Spawns> & DraftRequirementsMet<S, P> & DraftRelationsAllowed<R, Relates>) => SpawnedId<S, Root, HeldNames<P>>;
444
500
  /**
445
501
  * Queues component inserts (or replacements) on an existing entity, applied
446
502
  * at the next `applyDeferred()`. To change a value now, on an entity you
@@ -496,8 +552,8 @@ export interface CommandsApi<S extends Schema.Any, Root = unknown, Spawns = neve
496
552
  }
497
553
  /** The command queue the runtime gives each system: every command, unchecked, and `flush`. */
498
554
  export interface CommandQueue<S extends Schema.Any, Root = unknown> {
499
- readonly spawn: (draft: Entity.EntityDraft<S, any, Root>) => Entity.EntityId<S, Root>;
500
- readonly spawnIn: (scope: EntityScope.EntityScope<string, Root>, draft: Entity.EntityDraft<S, any, Root>) => Entity.EntityId<S, Root>;
555
+ readonly spawn: (draft: Entity.EntityDraft<S, any, Root, any>) => Entity.EntityId<S, Root>;
556
+ readonly spawnIn: (scope: EntityScope.EntityScope<string, Root>, draft: Entity.EntityDraft<S, any, Root, any>) => Entity.EntityId<S, Root>;
501
557
  readonly insert: (entity: Entity.EntityId<S, Root> | {
502
558
  readonly id: Entity.EntityId<S, Root>;
503
559
  }, ...entries: ReadonlyArray<SchemaEntry<S>>) => Entity.EntityId<S, Root>;