@adobe/data 0.9.81 → 0.9.83

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 (64) hide show
  1. package/dist/ecs/archetype/archetype.d.ts +23 -0
  2. package/dist/ecs/archetype/archetype.js.map +1 -1
  3. package/dist/ecs/database/create-plugin.d.ts +2 -1
  4. package/dist/ecs/database/create-plugin.js.map +1 -1
  5. package/dist/ecs/database/database-read.type-test.js +25 -0
  6. package/dist/ecs/database/database-read.type-test.js.map +1 -1
  7. package/dist/ecs/database/database.d.ts +26 -7
  8. package/dist/ecs/database/database.js.map +1 -1
  9. package/dist/ecs/database/database.partition.test.d.ts +1 -0
  10. package/dist/ecs/database/database.partition.test.js +45 -0
  11. package/dist/ecs/database/database.partition.test.js.map +1 -0
  12. package/dist/ecs/database/database.partition.type-test.d.ts +1 -0
  13. package/dist/ecs/database/database.partition.type-test.js +41 -0
  14. package/dist/ecs/database/database.partition.type-test.js.map +1 -0
  15. package/dist/ecs/database/deep-extends-chain.type-test.d.ts +255 -255
  16. package/dist/ecs/database/index.d.ts +0 -1
  17. package/dist/ecs/database/index.js +0 -1
  18. package/dist/ecs/database/index.js.map +1 -1
  19. package/dist/ecs/database/observe-derive.d.ts +4 -1
  20. package/dist/ecs/database/observe-derive.js +66 -35
  21. package/dist/ecs/database/observe-derive.js.map +1 -1
  22. package/dist/ecs/database/observe-derive.test.js +124 -0
  23. package/dist/ecs/database/observe-derive.test.js.map +1 -1
  24. package/dist/ecs/database/observed/observed-database.d.ts +3 -0
  25. package/dist/ecs/database/transactional-store/transactional-store.d.ts +6 -5
  26. package/dist/ecs/store/core/core.d.ts +33 -8
  27. package/dist/ecs/store/core/create-core.d.ts +12 -2
  28. package/dist/ecs/store/core/create-core.js +141 -22
  29. package/dist/ecs/store/core/create-core.js.map +1 -1
  30. package/dist/ecs/store/core/create-core.partition.test.d.ts +1 -0
  31. package/dist/ecs/store/core/create-core.partition.test.js +229 -0
  32. package/dist/ecs/store/core/create-core.partition.test.js.map +1 -0
  33. package/dist/ecs/store/core/select-entities.js +87 -21
  34. package/dist/ecs/store/core/select-entities.js.map +1 -1
  35. package/dist/ecs/store/core/select-entities.partition.test.d.ts +1 -0
  36. package/dist/ecs/store/core/select-entities.partition.test.js +93 -0
  37. package/dist/ecs/store/core/select-entities.partition.test.js.map +1 -0
  38. package/dist/ecs/store/entity-select-options.d.ts +5 -1
  39. package/dist/ecs/store/partition.d.ts +63 -0
  40. package/dist/ecs/store/partition.js +3 -0
  41. package/dist/ecs/store/partition.js.map +1 -0
  42. package/dist/ecs/store/partition.type-test.d.ts +1 -0
  43. package/dist/ecs/store/partition.type-test.js +15 -0
  44. package/dist/ecs/store/partition.type-test.js.map +1 -0
  45. package/dist/ecs/store/public/create-store.d.ts +3 -1
  46. package/dist/ecs/store/public/create-store.js +19 -50
  47. package/dist/ecs/store/public/create-store.js.map +1 -1
  48. package/dist/ecs/store/public/create-store.partition.test.d.ts +1 -0
  49. package/dist/ecs/store/public/create-store.partition.test.js +111 -0
  50. package/dist/ecs/store/public/create-store.partition.test.js.map +1 -0
  51. package/dist/ecs/store/public/create-store.partition.type-test.d.ts +1 -0
  52. package/dist/ecs/store/public/create-store.partition.type-test.js +61 -0
  53. package/dist/ecs/store/public/create-store.partition.type-test.js.map +1 -0
  54. package/dist/ecs/store/store.d.ts +15 -10
  55. package/dist/ecs/store/store.js.map +1 -1
  56. package/dist/ecs/store/transaction-functions.d.ts +3 -3
  57. package/dist/schema/schema.d.ts +1 -0
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +1 -1
  60. package/references/data-lit/package.json +1 -1
  61. package/references/data-lit-tictactoe/package.json +1 -1
  62. package/references/data-react/package.json +1 -1
  63. package/references/data-react-hello/package.json +1 -1
  64. package/references/data-react-pixie/package.json +1 -1
@@ -7,7 +7,6 @@ export * from "./reconciling/reconciling-entry.js";
7
7
  export * from "./observed/create-observed-database.js";
8
8
  export * from "./observed/observed-database.js";
9
9
  export * from "./database.js";
10
- export * from "./observe-dependent-value.js";
11
10
  export * from "./transactional-store/index.js";
12
11
  export * from "./database-schema/index.js";
13
12
  export type { Undoable } from "./undoable.js";
@@ -8,7 +8,6 @@ export * from "./reconciling/reconciling-entry.js";
8
8
  export * from "./observed/create-observed-database.js";
9
9
  export * from "./observed/observed-database.js";
10
10
  export * from "./database.js";
11
- export * from "./observe-dependent-value.js";
12
11
  export * from "./transactional-store/index.js";
13
12
  export * from "./database-schema/index.js";
14
13
  export * from "./combine-plugins.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ecs/database/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ecs/database/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC"}
@@ -8,4 +8,7 @@ import { TransactionResult } from "./transactional-store/transactional-store.js"
8
8
  * overlap, so the wrapper's "currently-recording" target is reset per run and
9
9
  * safely reused.
10
10
  */
11
- export declare const createDerive: <C extends object>(store: ReadonlyStore<C, any, any, any>, observeTransactions: Observe<TransactionResult<C>>) => <T>(compute: (db: any) => T) => Observe<T>;
11
+ export declare const createDerive: <C extends object>(store: ReadonlyStore<C, any, any, any>, observeTransactions: Observe<TransactionResult<C>>) => {
12
+ <T>(compute: (db: any) => T): Observe<T>;
13
+ <I extends Record<string, Observe<unknown>>, T>(inputs: I, compute: (db: any, inputs: { readonly [K in keyof I]: I[K] extends Observe<infer U> ? U : never; }) => T): Observe<T>;
14
+ };
@@ -1,4 +1,5 @@
1
1
  // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { Observe } from "../../observe/index.js";
2
3
  import { equals } from "../../equals.js";
3
4
  const emptyDeps = () => ({
4
5
  entityWhole: new Set(),
@@ -184,43 +185,73 @@ export const createDerive = (store, observeTransactions) => {
184
185
  // no dependency; delegate to the real archetypes.
185
186
  archetypes: store.archetypes,
186
187
  };
187
- return (compute) => (notify) => {
188
- let last;
189
- let hasLast = false;
190
- let deps = emptyDeps();
191
- const run = () => {
192
- recording = emptyDeps();
193
- try {
194
- return compute(recorder);
195
- }
196
- finally {
197
- deps = recording;
198
- recording = null;
199
- }
200
- };
201
- const emit = (value) => {
202
- if (!hasLast || !equals(last, value)) {
203
- last = value;
204
- hasLast = true;
205
- notify(value);
206
- }
207
- };
208
- emit(run());
209
- // `observeTransactions` fires once per committed transaction, so a
210
- // recompute happens at most once per commit. Emit synchronously at the
211
- // commit boundary — the same cadence as `observe.entity` / the raw
212
- // component observers a hand-written computed would use — rather than
213
- // deferring to a microtask, which would coalesce several commits in one
214
- // turn (e.g. a burst of ephemeral drag commits) into a single emission
215
- // and starve consumers that route per commit.
216
- const unobserve = observeTransactions((result) => {
217
- if (affected(deps, result)) {
188
+ // Implementation signature hidden; callers only ever see the two typed
189
+ // overloads above. `inputs` is `any` here solely because an overloaded impl
190
+ // signature must remain callable for the typed overload (whose `inputs` param
191
+ // is checked contravariantly); the public surface stays fully typed.
192
+ function derive(arg1, arg2) {
193
+ const inputObservables = typeof arg1 === "function" ? undefined : arg1;
194
+ const compute = typeof arg1 === "function" ? arg1 : arg2;
195
+ if (compute === undefined) {
196
+ throw new Error("db.derive requires a compute function");
197
+ }
198
+ return (notify) => {
199
+ let last;
200
+ let hasLast = false;
201
+ let deps = emptyDeps();
202
+ // Latest injected input snapshot; `ready` gates the ECS commit path
203
+ // until the inputs exist (no inputs → ready immediately).
204
+ let latestInputs;
205
+ let ready = inputObservables === undefined;
206
+ const run = () => {
207
+ recording = emptyDeps();
208
+ try {
209
+ return compute(recorder, latestInputs);
210
+ }
211
+ finally {
212
+ deps = recording;
213
+ recording = null;
214
+ }
215
+ };
216
+ const emit = (value) => {
217
+ if (!hasLast || !equals(last, value)) {
218
+ last = value;
219
+ hasLast = true;
220
+ notify(value);
221
+ }
222
+ };
223
+ // ECS commit gate — recompute when a recorded read could have changed.
224
+ // `observeTransactions` fires once per committed transaction, so a
225
+ // recompute happens at most once per commit, synchronously at the
226
+ // commit boundary (the same cadence as `observe.entity` / the raw
227
+ // component observers a hand-written computed would use). Guarded by
228
+ // `ready` so it never runs before the first dep set is recorded.
229
+ const unobserveTransactions = observeTransactions((result) => {
230
+ if (ready && affected(deps, result)) {
231
+ emit(run());
232
+ }
233
+ });
234
+ if (inputObservables === undefined) {
218
235
  emit(run());
236
+ return () => {
237
+ unobserveTransactions();
238
+ };
219
239
  }
220
- });
221
- return () => {
222
- unobserve();
240
+ // Inputs are subscribed once here at the root — never read inside the
241
+ // recording run — so the set is fixed for the derive's lifetime. Each
242
+ // emission refreshes the injected snapshot and recomputes; the first
243
+ // (all inputs present) is also the derive's first value.
244
+ const unobserveInputs = Observe.fromProperties(inputObservables)((values) => {
245
+ latestInputs = values;
246
+ ready = true;
247
+ emit(run());
248
+ });
249
+ return () => {
250
+ unobserveInputs();
251
+ unobserveTransactions();
252
+ };
223
253
  };
224
- };
254
+ }
255
+ return derive;
225
256
  };
226
257
  //# sourceMappingURL=observe-derive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observe-derive.js","sourceRoot":"","sources":["../../../src/ecs/database/observe-derive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observe-derive.js","sourceRoot":"","sources":["../../../src/ecs/database/observe-derive.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,25 @@ const createTestDatabase = () => Database.create(Database.Plugin.create({
31
31
  },
32
32
  }));
33
33
  const flush = () => new Promise((resolve) => queueMicrotask(() => resolve()));
34
+ // A minimal external (non-ECS) observable, standing in for a value a service
35
+ // might expose: emits the current value on subscribe, re-emits on `set`.
36
+ const makeSource = (initial) => {
37
+ let value = initial;
38
+ const observers = new Set();
39
+ const observe = (notify) => {
40
+ observers.add(notify);
41
+ notify(value);
42
+ return () => {
43
+ observers.delete(notify);
44
+ };
45
+ };
46
+ const set = (v) => {
47
+ value = v;
48
+ for (const o of observers)
49
+ o(v);
50
+ };
51
+ return { observe, set };
52
+ };
34
53
  describe("db.derive", () => {
35
54
  let db;
36
55
  let foo;
@@ -109,6 +128,111 @@ describe("db.derive", () => {
109
128
  expect(observer).toHaveBeenLastCalledWith(42);
110
129
  unsubscribe();
111
130
  });
131
+ // Documents the composition → derive migration for resource reads:
132
+ // before: Observe.withMap(
133
+ // Observe.fromProperties({ x: db.observe.resources.x, y: db.observe.resources.y }),
134
+ // ({ x, y }) => x + y)
135
+ // after: db.derive(db => db.resources.x + db.resources.y)
136
+ // The derive records BOTH resource reads and recomputes when either changes,
137
+ // with no hand-listed inputs. The callback param is deliberately named `db`
138
+ // to shadow the outer db, so a read cannot bind the outer (full) db and
139
+ // escape dependency tracking.
140
+ it("derives a value from multiple resources, recomputing when either changes", () => {
141
+ const sumDb = Database.create(Database.Plugin.create({
142
+ resources: {
143
+ x: { type: "number", default: 1 },
144
+ y: { type: "number", default: 2 },
145
+ },
146
+ transactions: {
147
+ setX(store, args) {
148
+ store.resources.x = args.x;
149
+ },
150
+ setY(store, args) {
151
+ store.resources.y = args.y;
152
+ },
153
+ },
154
+ }));
155
+ const observer = vi.fn();
156
+ const unsubscribe = sumDb.derive((db) => db.resources.x + db.resources.y)(observer);
157
+ expect(observer).toHaveBeenLastCalledWith(3); // initial: 1 + 2
158
+ sumDb.transactions.setX({ x: 10 });
159
+ expect(observer).toHaveBeenLastCalledWith(12); // 10 + 2
160
+ sumDb.transactions.setY({ y: 5 });
161
+ expect(observer).toHaveBeenLastCalledWith(15); // 10 + 5
162
+ expect(observer).toHaveBeenCalledTimes(3);
163
+ unsubscribe();
164
+ });
165
+ it("re-execution rebuilds the dependency set: a read dropped last run no longer triggers", () => {
166
+ // Reads `b` only while `a > 0`. Once `a` flips non-positive, the next run
167
+ // records deps WITHOUT `b`, so a later `b` change must not re-run the body.
168
+ const compute = vi.fn((d) => (d.get(foo, "a") > 0 ? d.get(foo, "b") : -1));
169
+ const unsubscribe = db.derive(compute)(() => { });
170
+ expect(compute).toHaveBeenCalledTimes(1); // a=1>0 → reads a AND b
171
+ db.transactions.setB({ e: foo, b: 20 });
172
+ expect(compute).toHaveBeenCalledTimes(2); // b is a dep → re-runs
173
+ db.transactions.setA({ e: foo, a: -1 });
174
+ expect(compute).toHaveBeenCalledTimes(3); // a is a dep → re-runs; now reads a only
175
+ db.transactions.setB({ e: foo, b: 30 });
176
+ expect(compute).toHaveBeenCalledTimes(3); // b dropped from deps → NO re-run
177
+ unsubscribe();
178
+ });
179
+ // ── inputs overload: fold external (non-ECS) observables into a derive ──
180
+ it("injects external input values and recomputes when either an input or an ECS read changes", () => {
181
+ const scale = makeSource(2);
182
+ const observer = vi.fn();
183
+ // one body reads an ECS value (`a` on foo) AND the injected external input
184
+ const unsubscribe = db.derive({ scale: scale.observe }, (d, inputs) => (d.get(foo, "a") ?? 0) * inputs.scale)(observer);
185
+ expect(observer).toHaveBeenLastCalledWith(2); // a=1 * scale=2
186
+ db.transactions.setA({ e: foo, a: 5 }); // ECS dep changed
187
+ expect(observer).toHaveBeenLastCalledWith(10); // 5 * 2 (latest input reused)
188
+ scale.set(3); // external input changed
189
+ expect(observer).toHaveBeenLastCalledWith(15); // 5 * 3 (latest ECS read reused)
190
+ unsubscribe();
191
+ });
192
+ it("combines two external inputs with an ECS index read", () => {
193
+ db.transactions.makeFoo({ a: 1, b: 0 }); // bucket a=1 now holds 2 entities
194
+ const weight = makeSource(10);
195
+ const label = makeSource("count");
196
+ const observer = vi.fn();
197
+ const unsubscribe = db.derive({ weight: weight.observe, label: label.observe }, (d, inputs) => `${inputs.label}=${d.indexes.byA.find({ a: 1 }).length * inputs.weight}`)(observer);
198
+ expect(observer).toHaveBeenLastCalledWith("count=20"); // 2 entities * 10
199
+ weight.set(100);
200
+ expect(observer).toHaveBeenLastCalledWith("count=200");
201
+ label.set("total");
202
+ expect(observer).toHaveBeenLastCalledWith("total=200");
203
+ unsubscribe();
204
+ });
205
+ it("withholds the first value until every input has emitted", () => {
206
+ // an input that does not emit synchronously on subscribe
207
+ let emitInput;
208
+ const deferred = (notify) => {
209
+ emitInput = notify;
210
+ return () => {
211
+ emitInput = undefined;
212
+ };
213
+ };
214
+ const observer = vi.fn();
215
+ const unsubscribe = db.derive({ d: deferred }, (_db, inputs) => inputs.d + 1)(observer);
216
+ expect(observer).not.toHaveBeenCalled(); // no input value yet → nothing computed
217
+ emitInput?.(10);
218
+ expect(observer).toHaveBeenCalledTimes(1);
219
+ expect(observer).toHaveBeenLastCalledWith(11);
220
+ unsubscribe();
221
+ });
222
+ it("structurally dedupes across input changes", () => {
223
+ const flag = makeSource(1);
224
+ const compute = vi.fn((_db, inputs) => (inputs.flag > 0 ? "pos" : "neg"));
225
+ const observer = vi.fn();
226
+ const unsubscribe = db.derive({ flag: flag.observe }, compute)(observer);
227
+ expect(observer).toHaveBeenCalledTimes(1); // "pos"
228
+ flag.set(5); // still positive → recompute runs but result unchanged → no emit
229
+ expect(compute).toHaveBeenCalledTimes(2);
230
+ expect(observer).toHaveBeenCalledTimes(1);
231
+ flag.set(-1); // flips
232
+ expect(observer).toHaveBeenCalledTimes(2);
233
+ expect(observer).toHaveBeenLastCalledWith("neg");
234
+ unsubscribe();
235
+ });
112
236
  it("re-emits on a change to an index bucket it read", async () => {
113
237
  const observer = vi.fn();
114
238
  const unsubscribe = db.derive((d) => d.indexes.byA.find({ a: 1 }).length)(observer);
@@ -1 +1 @@
1
- {"version":3,"file":"observe-derive.test.js","sourceRoot":"","sources":["../../../src/ecs/database/observe-derive.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observe-derive.test.js","sourceRoot":"","sources":["../../../src/ecs/database/observe-derive.test.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,9 @@ export interface ObservedDatabase<C extends Components, R extends ResourceCompon
29
29
  select<Include extends StringKeyof<C>, T extends Include>(include: readonly Include[] | ReadonlySet<string>, options?: any): Observe<readonly Entity[]>;
30
30
  };
31
31
  derive<T>(compute: (db: any) => T): Observe<T>;
32
+ derive<I extends Record<string, Observe<unknown>>, T>(inputs: I, compute: (db: any, inputs: {
33
+ readonly [K in keyof I]: I[K] extends Observe<infer U> ? U : never;
34
+ }) => T): Observe<T>;
32
35
  readonly execute: (handler: (ctx: TransactionContext<C, R, A>) => Entity | void, options?: {
33
36
  transient?: boolean;
34
37
  userId?: number | string;
@@ -9,6 +9,7 @@ import { ArchetypeComponents } from "../../store/archetype-components.js";
9
9
  import { FromSchemas } from "../../../schema/from-schemas.js";
10
10
  import { Undoable } from "../undoable.js";
11
11
  import { IndexDeclarations } from "../../store/index-types.js";
12
+ import { PartitionKeysOf } from "../../store/partition.js";
12
13
  /**
13
14
  * The first argument passed to every transaction function. Extends the full
14
15
  * store read/write surface with `userId` — the identifier of the peer or user
@@ -18,10 +19,10 @@ import { IndexDeclarations } from "../../store/index-types.js";
18
19
  *
19
20
  * `userId` is `undefined` in local-only (no-sync) databases.
20
21
  */
21
- export type TransactionContext<C extends Components, R extends ResourceComponents, A extends ArchetypeComponents<StringKeyof<C>>, IX extends IndexDeclarations<C> = {}> = Store<C, R, A, IX> & {
22
+ export type TransactionContext<C extends Components, R extends ResourceComponents, A extends ArchetypeComponents<StringKeyof<C>>, IX extends IndexDeclarations<C> = {}, PK extends string = never> = Store<C, R, A, IX, PK> & {
22
23
  readonly userId: number | string | undefined;
23
24
  };
24
- export interface TransactionalStore<C extends Components = never, R extends ResourceComponents = never, A extends ArchetypeComponents<StringKeyof<C>> = never, IX extends IndexDeclarations<C> = {}> extends ReadonlyStore<C, R, A, IX> {
25
+ export interface TransactionalStore<C extends Components = never, R extends ResourceComponents = never, A extends ArchetypeComponents<StringKeyof<C>> = never, IX extends IndexDeclarations<C> = {}, PK extends string = never> extends ReadonlyStore<C, R, A, IX, PK> {
25
26
  /**
26
27
  * Execute a transaction on the store.
27
28
  * The transactionFunction must NOT directly mutate archetype rows as those changes would not be captured.
@@ -29,12 +30,12 @@ export interface TransactionalStore<C extends Components = never, R extends Reso
29
30
  * @param transactionFunction - A function that takes the store as an argument and performs some operations on it.
30
31
  * @returns A promise that resolves when the transaction is complete.
31
32
  */
32
- execute(transactionFunction: (t: TransactionContext<C, R, A>) => Entity | void, options?: {
33
+ execute(transactionFunction: (t: TransactionContext<C, R, A, IX, PK>) => Entity | void, options?: {
33
34
  intermediate?: boolean;
34
35
  userId?: number | string;
35
36
  }): TransactionResult<C>;
36
- extend<S extends Store.Schema<any, any, any>>(schema: S): TransactionalStore<C & (S extends Store.Schema<infer XC, any, any> ? FromSchemas<XC> : never), R & (S extends Store.Schema<any, infer XR, any> ? FromSchemas<XR> : never), A & (S extends Store.Schema<any, any, infer XA> ? XA : never)>;
37
- transactionStore: Store<C, R, A>;
37
+ extend<S extends Store.Schema<any, any, any>>(schema: S): TransactionalStore<C & (S extends Store.Schema<infer XC, any, any> ? FromSchemas<XC> : never), R & (S extends Store.Schema<any, infer XR, any> ? FromSchemas<XR> : never), A & (S extends Store.Schema<any, any, infer XA> ? XA : never), IX, PK | (S extends Store.Schema<infer XC, any, any> ? PartitionKeysOf<XC> : never)>;
38
+ transactionStore: Store<C, R, A, IX, PK>;
38
39
  }
39
40
  export type TransactionInsertOperation<C> = {
40
41
  type: "insert";
@@ -5,6 +5,7 @@ import { RequiredComponents } from "../../required-components.js";
5
5
  import { StringKeyof } from "../../../types/index.js";
6
6
  import { Components } from "../components.js";
7
7
  import { OptionalComponents } from "../../optional-components.js";
8
+ import { HasPartitionKey } from "../partition.js";
8
9
  export type EntityValues<C> = {
9
10
  readonly [K in (RequiredComponents & StringKeyof<C & OptionalComponents>)]: (C & OptionalComponents)[K];
10
11
  };
@@ -12,15 +13,32 @@ export type EntityReadValues<C> = RequiredComponents & {
12
13
  readonly [K in StringKeyof<C & OptionalComponents> as string extends K ? never : K]?: (C & OptionalComponents)[K];
13
14
  };
14
15
  export type EntityUpdateValues<C> = Partial<Omit<C, "id">>;
15
- export type ArchetypeQueryOptions<C extends object> = {
16
- exclude?: readonly StringKeyof<C & OptionalComponents>[];
16
+ export type ArchetypeQueryOptions<C extends object, PK extends string = never> = {
17
+ exclude?: readonly StringKeyof<C & RequiredComponents & OptionalComponents>[];
18
+ /**
19
+ * Filter to archetypes whose partition component equals the given value.
20
+ * A partition column is const per archetype, so this is decided at
21
+ * archetype granularity (O(archetypes), no row scan). Keyed to the store's
22
+ * partition components only — a non-partition column is not const per
23
+ * archetype, so a value filter on it is not archetype-decidable.
24
+ */
25
+ where?: {
26
+ readonly [K in Extract<PK, StringKeyof<C & OptionalComponents>>]?: (C & RequiredComponents & OptionalComponents)[K];
27
+ };
17
28
  };
18
- export interface ReadonlyCore<C extends Components = never> {
29
+ export interface ReadonlyCore<C extends Components = never, PK extends string = never> {
19
30
  readonly componentSchemas: {
20
31
  readonly [K in StringKeyof<C & RequiredComponents & OptionalComponents>]: Schema;
21
32
  };
22
- queryArchetypes<Include extends StringKeyof<C & RequiredComponents & OptionalComponents>>(include: readonly Include[] | ReadonlySet<string>, options?: ArchetypeQueryOptions<C>): readonly ReadonlyArchetype<RequiredComponents & Pick<C & RequiredComponents & OptionalComponents, Include>>[];
23
- ensureArchetype: <const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>) => ReadonlyArchetype<RequiredComponents & {
33
+ queryArchetypes<Include extends StringKeyof<C & RequiredComponents & OptionalComponents>>(include: readonly Include[] | ReadonlySet<string>, options?: ArchetypeQueryOptions<C, PK>): readonly ReadonlyArchetype<RequiredComponents & Pick<C & RequiredComponents & OptionalComponents, Include>>[];
34
+ ensureArchetype<const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>): HasPartitionKey<CC, PK> extends true ? Archetype.Router<RequiredComponents & {
35
+ [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
36
+ }> : ReadonlyArchetype<RequiredComponents & {
37
+ [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
38
+ }>;
39
+ ensureArchetype<const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>, partitionValues: {
40
+ readonly [K in Extract<CC, PK>]: (C & RequiredComponents & OptionalComponents)[K];
41
+ }): ReadonlyArchetype<RequiredComponents & {
24
42
  [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
25
43
  }>;
26
44
  locate: (entity: Entity) => {
@@ -62,9 +80,16 @@ export interface ReadonlyCore<C extends Components = never> {
62
80
  /**
63
81
  * This is the main interface for the low level ECS Core.
64
82
  */
65
- export interface Core<C extends Components = never> extends ReadonlyCore<C> {
66
- queryArchetypes<Include extends StringKeyof<C & RequiredComponents & OptionalComponents>>(include: readonly Include[] | ReadonlySet<string>, options?: ArchetypeQueryOptions<C>): readonly Archetype<RequiredComponents & Pick<C & RequiredComponents & OptionalComponents, Include>>[];
67
- ensureArchetype: <const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>) => Archetype<RequiredComponents & {
83
+ export interface Core<C extends Components = never, PK extends string = never> extends ReadonlyCore<C, PK> {
84
+ queryArchetypes<Include extends StringKeyof<C & RequiredComponents & OptionalComponents>>(include: readonly Include[] | ReadonlySet<string>, options?: ArchetypeQueryOptions<C, PK>): readonly Archetype<RequiredComponents & Pick<C & RequiredComponents & OptionalComponents, Include>>[];
85
+ ensureArchetype<const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>): HasPartitionKey<CC, PK> extends true ? Archetype.Router<RequiredComponents & {
86
+ [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
87
+ }> : Archetype<RequiredComponents & {
88
+ [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
89
+ }>;
90
+ ensureArchetype<const CC extends StringKeyof<C & RequiredComponents & OptionalComponents>>(components: readonly CC[] | ReadonlySet<CC>, partitionValues: {
91
+ readonly [K in Extract<CC, PK>]: (C & RequiredComponents & OptionalComponents)[K];
92
+ }): Archetype<RequiredComponents & {
68
93
  [K in CC]: (C & RequiredComponents & OptionalComponents)[K];
69
94
  }>;
70
95
  locate: (entity: Entity) => {
@@ -1,8 +1,10 @@
1
1
  import { Schema } from "../../../schema/index.js";
2
+ import { Archetype } from "../../archetype/archetype.js";
2
3
  import { Core } from "./core.js";
3
4
  import { Simplify, StringKeyof } from "../../../types/index.js";
4
5
  import { ComponentSchemas } from "../../component-schemas.js";
5
6
  import { OptionalComponents } from "../../optional-components.js";
7
+ import { PartitionKeysOf } from "../partition.js";
6
8
  /**
7
9
  * Serialization format version stamped into every `toData` snapshot and
8
10
  * checked by `fromData`. A mismatch is thrown rather than silently
@@ -14,6 +16,14 @@ import { OptionalComponents } from "../../optional-components.js";
14
16
  * changes in a way older readers cannot load.
15
17
  */
16
18
  export declare const ECS_SNAPSHOT_VERSION = 1;
17
- export declare function createCore<NC extends ComponentSchemas>(newComponentSchemas: NC): Core<Simplify<OptionalComponents & {
19
+ export declare function createCore<NC extends ComponentSchemas>(newComponentSchemas: NC,
20
+ /**
21
+ * Called once, right after each archetype is created (direct or lazily as a
22
+ * partition value-child). The Store layer uses it to decorate the
23
+ * archetype's `insert` in place with index maintenance — so every write
24
+ * path (direct insert, router routing, migration target) shares one
25
+ * maintained insert with no wrapper or Proxy indirection.
26
+ */
27
+ onArchetypeCreated?: (archetype: Archetype<any>) => void): Core<Simplify<OptionalComponents & {
18
28
  [K in StringKeyof<NC>]: Schema.ToType<NC[K]>;
19
- }>>;
29
+ }>, PartitionKeysOf<NC>>;