@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
@@ -35,6 +35,29 @@ export interface Archetype<C extends RequiredComponents = RequiredComponents> ex
35
35
  toData: (copy?: boolean) => unknown;
36
36
  fromData: (data: unknown) => void;
37
37
  }
38
+ export declare namespace Archetype {
39
+ /**
40
+ * Write-only handle over a *family* of archetypes that share a component set
41
+ * but differ by the value of one or more `partition` components. `insert`
42
+ * reads the partition value(s) from the row, resolves (creating on first use)
43
+ * the concrete child archetype for that value, and inserts there.
44
+ *
45
+ * A family has no single dense column view, so — unlike {@link Archetype} — a
46
+ * Router exposes no `columns`, `rowCount`, or iteration. Read a family through
47
+ * `queryArchetypes` (optionally filtered by partition value), or narrow to one
48
+ * concrete member by supplying the value to `ensureArchetype`.
49
+ *
50
+ * `insert` is deliberately signature-identical to {@link Archetype.insert}: a
51
+ * discriminated `Archetype<C> | Archetype.Router<C>` (produced when the
52
+ * requested keys are not statically known to include/exclude a partition
53
+ * component) therefore still permits `.insert` with no narrowing — only dense
54
+ * column access requires having resolved to a concrete {@link Archetype}.
55
+ */
56
+ interface Router<C extends RequiredComponents = RequiredComponents> {
57
+ readonly components: ComponentSet<StringKeyof<C>>;
58
+ insert: <T extends EntityInsertValues<C>>(rowData: Exact<EntityInsertValues<C>, T>) => Entity;
59
+ }
60
+ }
38
61
  export type FromArchetype<T> = T extends ReadonlyArchetype<infer C> ? {
39
62
  readonly [K in keyof C]: C[K];
40
63
  } : T extends Archetype<infer C> ? {
@@ -1 +1 @@
1
- {"version":3,"file":"archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/archetype.ts"],"names":[],"mappings":"AAsDA,gDAAgD;AAChD,CAAC;IAKG,2BAA2B;IAC3B,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;IAC7C,CAAC,CAAC;IAEF,2CAA2C;IAC3C,MAAM,iBAAiB,GAAG,CAAC,IAAmB,EAAE,EAAE;QAC9C,MAAM,WAAW,GAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAChG,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/archetype.ts"],"names":[],"mappings":"AA+EA,gDAAgD;AAChD,CAAC;IAKG,2BAA2B;IAC3B,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;IAC7C,CAAC,CAAC;IAEF,2CAA2C;IAC3C,MAAM,iBAAiB,GAAG,CAAC,IAAmB,EAAE,EAAE;QAC9C,MAAM,WAAW,GAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAChG,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;AACN,CAAC"}
@@ -5,6 +5,7 @@ import type { ArchetypeComponents } from "../store/archetype-components.js";
5
5
  import type { TransactionDeclarations, ToTransactionFunctions } from "../store/transaction-functions.js";
6
6
  import type { ToActionFunctions } from "../store/action-functions.js";
7
7
  import type { FromSchemas } from "../../schema/index.js";
8
+ import type { PartitionKeysOf } from "../store/partition.js";
8
9
  import type { StringKeyof, NoInfer, RemoveIndex } from "../../types/types.js";
9
10
  import { Store } from "../store/store.js";
10
11
  /**
@@ -83,7 +84,7 @@ type FullDBForPlugin<CS, RS, A, TD, S extends string, AD, XP extends Database.Pl
83
84
  * `& {}` (identity on the object-typed buckets) — no cost or behavior change.
84
85
  */
85
86
  type AmbientPlugin<XP extends Database.Plugin, IP extends Database.Plugin> = Database.Plugin<XP['components'] & IP['components'], XP['resources'] & IP['resources'], XP['archetypes'] & IP['archetypes'], XP['transactions'] & IP['transactions'], StringKeyof<XP['systems']> | StringKeyof<IP['systems']>, XP['actions'] & IP['actions'], XP['services'] & IP['services'], XP['computed'] & IP['computed'], XP['indexes'] & IP['indexes']>;
86
- export declare function createPlugin<const XP extends Database.Plugin<{}, {}, {}, {}, never, {}, {}, {}, {}>, const IP extends Database.Plugin<{}, {}, {}, {}, never, {}, {}, {}, {}>, const CS extends ComponentSchemas, const RS extends ResourceSchemas, const A extends ArchetypeComponents<StringKeyof<RemoveIndex<CS> & XP['components'] & IP['components']>>, const IX extends IndexDeclarations<FromSchemas<RemoveIndex<CS> & XP['components'] & IP['components']>, RemoveIndex<A> & XP['archetypes'] & IP['archetypes']>, const TD extends TransactionDeclarations<FromSchemas<RemoveIndex<CS> & XP['components'] & IP['components']>, FromSchemas<RemoveIndex<RS> & XP['resources'] & IP['resources']>, RemoveIndex<A> & XP['archetypes'] & IP['archetypes'], RemoveIndex<IX> & XP['indexes'] & IP['indexes']>, const AD, const S extends string = never, const SVF extends ServiceFactories<Database.FromPlugin<AmbientPlugin<XP, IP>>> = {}, const CVF extends PluginComputedFactories<FullDBForPlugin<RemoveIndex<CS>, RemoveIndex<RS>, RemoveIndex<A>, RemoveIndex<TD>, S, RemoveIndex<AD> & XP['actions'] & IP['actions'], AmbientPlugin<XP, IP>, RemoveIndex<SVF>, RemoveIndex<IX>>> = {}>(plugins: {
87
+ export declare function createPlugin<const XP extends Database.Plugin<{}, {}, {}, {}, never, {}, {}, {}, {}>, const IP extends Database.Plugin<{}, {}, {}, {}, never, {}, {}, {}, {}>, const CS extends ComponentSchemas, const RS extends ResourceSchemas, const A extends ArchetypeComponents<StringKeyof<RemoveIndex<CS> & XP['components'] & IP['components']>>, const IX extends IndexDeclarations<FromSchemas<RemoveIndex<CS> & XP['components'] & IP['components']>, RemoveIndex<A> & XP['archetypes'] & IP['archetypes']>, const TD extends TransactionDeclarations<FromSchemas<RemoveIndex<CS> & XP['components'] & IP['components']>, FromSchemas<RemoveIndex<RS> & XP['resources'] & IP['resources']>, RemoveIndex<A> & XP['archetypes'] & IP['archetypes'], RemoveIndex<IX> & XP['indexes'] & IP['indexes'], PartitionKeysOf<RemoveIndex<CS> & XP['components'] & IP['components']>>, const AD, const S extends string = never, const SVF extends ServiceFactories<Database.FromPlugin<AmbientPlugin<XP, IP>>> = {}, const CVF extends PluginComputedFactories<FullDBForPlugin<RemoveIndex<CS>, RemoveIndex<RS>, RemoveIndex<A>, RemoveIndex<TD>, S, RemoveIndex<AD> & XP['actions'] & IP['actions'], AmbientPlugin<XP, IP>, RemoveIndex<SVF>, RemoveIndex<IX>>> = {}>(plugins: {
87
88
  imports?: IP;
88
89
  extends?: XP;
89
90
  services?: SVF & {
@@ -1 +1 @@
1
- {"version":3,"file":"create-plugin.js","sourceRoot":"","sources":["../../../src/ecs/database/create-plugin.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAUvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0CtD,SAAS,qBAAqB,CAAC,OAAgC;IAC3D,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/J,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;IAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;QACD,uDAAuD;QACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,iBAAiB,GAAG,aAAa,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACX,qCAAqC,GAAG,uBAAuB,OAAO,KAAK;oBAC3E,mBAAmB,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AA6GD,MAAM,UAAU,YAAY,CAaxB,OAmDC;IAED,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,mEAAmE;IACnE,MAAM,MAAM,GAAQ;QAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KACjC,CAAC;IAEF,wEAAwE;IACxE,0EAA0E;IAC1E,qEAAqE;IACrE,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,CAAQ,CAAC;IACnD,CAAC;IACD,OAAO,MAAa,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"create-plugin.js","sourceRoot":"","sources":["../../../src/ecs/database/create-plugin.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,31 @@ function derivePositive() {
79
79
  // a unique index also exposes `get`
80
80
  const head = db.derive((d) => d.indexes.byXUnique.get({ x: 1 }));
81
81
  }
82
+ function deriveInputsPositive() {
83
+ // inputs are injected as current values, strongly typed by unwrapping each Observe
84
+ const sum = db.derive({ n: numberInput, s: stringInput }, (d, inputs) => {
85
+ // the first arg is still the read projection
86
+ const r = d.resources.frameRate;
87
+ return `${inputs.s}:${inputs.n + r}`;
88
+ });
89
+ // a body that mixes an ECS read with an injected input value
90
+ const mixed = db.derive({ n: numberInput }, (d, inputs) => (d.get(0, "x") ?? 0) + inputs.n);
91
+ }
92
+ function deriveInputsNegative() {
93
+ db.derive({ n: numberInput }, (d, inputs) => {
94
+ void d;
95
+ // @ts-expect-error `n` unwraps to number, not string
96
+ const bad = inputs.n;
97
+ return bad;
98
+ });
99
+ db.derive({ n: numberInput }, (d, inputs) => {
100
+ void d;
101
+ // @ts-expect-error `m` is not an injected input
102
+ return inputs.m;
103
+ });
104
+ // @ts-expect-error an input value must be an Observe, not a bare value
105
+ db.derive({ n: 123 }, (d, inputs) => inputs.n);
106
+ }
82
107
  // ============================================================================
83
108
  // derive — NEGATIVE: everything the read projection removes
84
109
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"database-read.type-test.js","sourceRoot":"","sources":["../../../src/ecs/database/database-read.type-test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-read.type-test.js","sourceRoot":"","sources":["../../../src/ecs/database/database-read.type-test.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ import { createDatabase } from "./public/create-database.js";
17
17
  import type { ConcurrencyStrategy } from "./concurrency/concurrency-strategy.js";
18
18
  import { ResourceSchemas } from "../resource-schemas.js";
19
19
  import { ComponentSchemas } from "../component-schemas.js";
20
+ import { PartitionKeysOf } from "../store/partition.js";
20
21
  import { FromSchemas } from "../../schema/index.js";
21
22
  import type { TransactionDeclarations, TransactionFunctions, ToTransactionFunctions } from "../store/transaction-functions.js";
22
23
  import type { ActionDeclarations, ActionFunctions, ToActionFunctions } from "../store/action-functions.js";
@@ -89,7 +90,7 @@ export type PluginComputedFactories<DB = any> = {
89
90
  */
90
91
  export type { IndexDeclarations } from "../store/index-types.js";
91
92
  import type { IndexDeclarations } from "../store/index-types.js";
92
- export interface Database<C extends Components = {}, R extends ResourceComponents = {}, A extends ArchetypeComponents<StringKeyof<C>> = {}, F extends TransactionFunctions = {}, S extends string = never, AF extends ActionFunctions = {}, SV = {}, CV = unknown, IX extends IndexDeclarations<C> = {}> extends ReadonlyStore<C, R, A, IX>, Service {
93
+ export interface Database<C extends Components = {}, R extends ResourceComponents = {}, A extends ArchetypeComponents<StringKeyof<C>> = {}, F extends TransactionFunctions = {}, S extends string = never, AF extends ActionFunctions = {}, SV = {}, CV = unknown, IX extends IndexDeclarations<C> = {}, PK extends string = never> extends ReadonlyStore<C, R, A, IX, PK>, Service {
93
94
  readonly transactions: F & Service;
94
95
  readonly actions: AF & Service;
95
96
  readonly services: SV;
@@ -148,10 +149,28 @@ export interface Database<C extends Components = {}, R extends ResourceComponent
148
149
  * never re-notifies.
149
150
  *
150
151
  * The callback receives `Database.Read<this>`, so an *intersection* database
151
- * (e.g. `IndexedCoreDatabase & ResourceComputedDatabase`) resolves to the
152
- * merged read surface — consumers never need to cast.
152
+ * resolves to the merged read surface — consumers never need to cast.
153
153
  */
154
154
  derive<T>(compute: (db: Database.Read<this>) => T): Observe<T>;
155
+ /**
156
+ * `derive` with a fixed record of external `inputs` — arbitrary `Observe<T>`
157
+ * values that do NOT live in the ECS (e.g. observables exposed by services).
158
+ * Their CURRENT values are injected as the second callback argument, keyed the
159
+ * same as `inputs` and unwrapped (`Observe<U> → U`); the first argument stays
160
+ * the read projection, so a body can fold external values and ECS reads into
161
+ * one synchronous expression.
162
+ *
163
+ * The inputs are subscribed once, at the root (not read dynamically inside the
164
+ * body), so the set is fixed for the life of the derive. The derive recomputes
165
+ * when any input emits OR an ECS read it recorded could have changed; like
166
+ * {@link Observe.fromProperties}, the first value is withheld until every input
167
+ * has produced one. Anything dynamic — an input set that depends on data, or
168
+ * an input whose arguments come from an ECS read — composes with
169
+ * {@link Observe.withSwitch} / {@link Observe.fromKeys} around the derive.
170
+ */
171
+ derive<I extends Record<string, Observe<unknown>>, T>(inputs: I, compute: (db: Database.Read<this>, inputs: {
172
+ readonly [K in keyof I]: I[K] extends Observe<infer U> ? U : never;
173
+ }) => T): Observe<T>;
155
174
  /**
156
175
  * Wipes all entities and resets all resources to their plugin defaults,
157
176
  * preserving database identity (observers, transaction wrappers, sync
@@ -222,7 +241,7 @@ export declare namespace Database {
222
241
  * (P extends Plugin<infer CS, ...> ? CS : never) to avoid expensive 8-way type
223
242
  * expansion that amplifies TS7056 serialization overflow in deep extends chains.
224
243
  */
225
- type FromPlugin<P extends Database.Plugin> = Database<FromSchemas<RemoveIndex<P['components']>>, FromSchemas<RemoveIndex<P['resources']>>, RemoveIndex<P['archetypes']>, ToTransactionFunctions<RemoveIndex<P['transactions']>>, StringKeyof<P['systems']>, ToActionFunctions<RemoveIndex<P['actions']>>, FromServiceFactories<RemoveIndex<P['services']>>, FromComputedFactories<RemoveIndex<P['computed']>>, RemoveIndex<P['indexes']>>;
244
+ type FromPlugin<P extends Database.Plugin> = Database<FromSchemas<RemoveIndex<P['components']>>, FromSchemas<RemoveIndex<P['resources']>>, RemoveIndex<P['archetypes']>, ToTransactionFunctions<RemoveIndex<P['transactions']>>, StringKeyof<P['systems']>, ToActionFunctions<RemoveIndex<P['actions']>>, FromServiceFactories<RemoveIndex<P['services']>>, FromComputedFactories<RemoveIndex<P['computed']>>, RemoveIndex<P['indexes']>, PartitionKeysOf<RemoveIndex<P['components']>>>;
226
245
  /**
227
246
  * The read-only projection of a Database that a `db.derive` callback
228
247
  * receives. It exposes only the auto-trackable read surface —
@@ -240,7 +259,7 @@ export declare namespace Database {
240
259
  * Because the surface is narrowed structurally, misuse is a compile error
241
260
  * rather than a value that must be guarded / thrown on at runtime.
242
261
  */
243
- type Read<DB extends Database<any, any, any, any, any, any, any, any, any>> = Pick<DB, "get" | "read" | "resources"> & {
262
+ type Read<DB extends Database<any, any, any, any, any, any, any, any, any, any>> = Pick<DB, "get" | "read" | "resources"> & {
244
263
  select(include: readonly string[] | ReadonlySet<string>, options?: {
245
264
  readonly exclude?: readonly string[];
246
265
  }): readonly Entity[];
@@ -248,7 +267,7 @@ export declare namespace Database {
248
267
  readonly [K in keyof DB["indexes"]]: Omit<DB["indexes"][K], "observe">;
249
268
  };
250
269
  readonly archetypes: {
251
- readonly [K in keyof DB["archetypes"]]: Pick<DB["archetypes"][K], "components" | "id">;
270
+ readonly [K in keyof DB["archetypes"]]: Pick<DB["archetypes"][K], ("components" | "id") & keyof DB["archetypes"][K]>;
252
271
  };
253
272
  };
254
273
  const create: typeof createDatabase;
@@ -304,7 +323,7 @@ export declare namespace Database {
304
323
  * another plugin's transaction declaration; `ToStore<P>` is the bare
305
324
  * store type and does not include `userId`.
306
325
  */
307
- type ToTransactionContext<P extends Database.Plugin> = TransactionContext<FromSchemas<RemoveIndex<P['components']>>, FromSchemas<RemoveIndex<P['resources']>>, RemoveIndex<P['archetypes']>>;
326
+ type ToTransactionContext<P extends Database.Plugin> = TransactionContext<FromSchemas<RemoveIndex<P['components']>>, FromSchemas<RemoveIndex<P['resources']>>, RemoveIndex<P['archetypes']>, RemoveIndex<P['indexes']>, PartitionKeysOf<RemoveIndex<P['components']>>>;
308
327
  type ToSystemDatabase<P extends Database.Plugin> = Database.FromPlugin<P> & {
309
328
  readonly store: Database.Plugin.ToStore<P>;
310
329
  services: {
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/ecs/database/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAkBvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAc1F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoNtD,MAAM,KAAW,QAAQ,CAkKxB;AAlKD,WAAiB,QAAQ;IAoEV,eAAM,GAAG,cAAc,CAAC;IAExB,WAAE,GAAG,CAAC,KAAc,EAAqB,EAAE;QACtD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;IAC1L,CAAC,CAAA;IAEY,0BAAiB,GAAG,kBAAkB,CAAC;IAiEpD,IAAiB,MAAM,CAqBtB;IArBD,WAAiB,MAAM;QACR,aAAM,GAAG,YAAY,CAAC;QACtB,cAAO,GAAG,cAAc,CAAC;IAmBxC,CAAC,EArBgB,MAAM,GAAN,eAAM,KAAN,eAAM,QAqBtB;AAEH,CAAC,EAlKgB,QAAQ,KAAR,QAAQ,QAkKxB"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/ecs/database/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAkBvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAe1F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA2OtD,MAAM,KAAW,QAAQ,CAmKxB;AAnKD,WAAiB,QAAQ;IAqEV,eAAM,GAAG,cAAc,CAAC;IAExB,WAAE,GAAG,CAAC,KAAc,EAAqB,EAAE;QACtD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;IAC1L,CAAC,CAAA;IAEY,0BAAiB,GAAG,kBAAkB,CAAC;IAiEpD,IAAiB,MAAM,CAqBtB;IArBD,WAAiB,MAAM;QACR,aAAM,GAAG,YAAY,CAAC;QACtB,cAAO,GAAG,cAAc,CAAC;IAmBxC,CAAC,EArBgB,MAAM,GAAN,eAAM,KAAN,eAAM,QAqBtB;AAEH,CAAC,EAnKgB,QAAQ,KAAR,QAAQ,QAmKxB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect } from "vitest";
3
+ import { Database } from "./database.js";
4
+ // A plugin whose `cell` component partitions, with a unique name index. The
5
+ // transactions write through the transaction context `t`, exercising routing
6
+ // and index maintenance on the committed-transaction path.
7
+ const plugin = () => Database.Plugin.create({
8
+ components: {
9
+ cell: { type: "integer", partition: true },
10
+ name: { type: "string" },
11
+ },
12
+ archetypes: { Spatial: ["cell", "name"] },
13
+ indexes: { byName: { key: "name", unique: true } },
14
+ transactions: {
15
+ add: (t, input) => t.archetypes.Spatial.insert(input),
16
+ move: (t, input) => { t.update(input.entity, { cell: input.cell }); },
17
+ },
18
+ });
19
+ describe("Database partition integration (transaction context)", () => {
20
+ it("routes t.archetypes.<PartitionedName> inserts and maintains indexes", () => {
21
+ const db = Database.create(plugin());
22
+ const a = db.transactions.add({ cell: 1, name: "alice" });
23
+ const b = db.transactions.add({ cell: 2, name: "bob" });
24
+ expect(db.indexes.byName.get({ name: "alice" })).toBe(a);
25
+ expect(db.indexes.byName.get({ name: "bob" })).toBe(b);
26
+ // Distinct cells → distinct concrete archetypes.
27
+ expect(db.locate(a).archetype).not.toBe(db.locate(b).archetype);
28
+ expect(db.get(a, "cell")).toBe(1);
29
+ });
30
+ it("migrates on a partition-value change inside a transaction; index follows", () => {
31
+ const db = Database.create(plugin());
32
+ const e = db.transactions.add({ cell: 1, name: "mover" });
33
+ db.transactions.move({ entity: e, cell: 2 });
34
+ expect(db.get(e, "cell")).toBe(2);
35
+ expect(db.indexes.byName.get({ name: "mover" })).toBe(e);
36
+ });
37
+ it("enforces a unique index across value-children inside a transaction (atomic)", () => {
38
+ const db = Database.create(plugin());
39
+ const first = db.transactions.add({ cell: 1, name: "dup" });
40
+ expect(() => db.transactions.add({ cell: 2, name: "dup" })).toThrow(/[Uu]nique/);
41
+ // Original intact — the failed transaction rolled back cleanly.
42
+ expect(db.indexes.byName.get({ name: "dup" })).toBe(first);
43
+ });
44
+ });
45
+ //# sourceMappingURL=database.partition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.partition.test.js","sourceRoot":"","sources":["../../../src/ecs/database/database.partition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ //
3
+ // Compile-time (red/green) verification that the transaction context `t`
4
+ // discriminates partition archetypes — both `t.archetypes.<Name>` and
5
+ // `t.ensureArchetype`. Wrapped in a never-called function so the file
6
+ // type-checks without executing the plugin factory.
7
+ import { Database } from "./database.js";
8
+ function _transactionContextDiscrimination() {
9
+ Database.Plugin.create({
10
+ components: {
11
+ cell: { type: "integer", partition: true },
12
+ position: { type: "number" },
13
+ health: { type: "number" },
14
+ },
15
+ archetypes: {
16
+ Spatial: ["cell", "position"], // partition family
17
+ Mob: ["position", "health"], // concrete
18
+ },
19
+ transactions: {
20
+ check: (t) => {
21
+ // A partitioned named archetype is a Router on `t` — write via insert.
22
+ t.archetypes.Spatial.insert({ cell: 1, position: 2 });
23
+ // @ts-expect-error - Spatial is a partition family (Router), not a concrete Archetype
24
+ t.archetypes.Spatial.columns;
25
+ // A non-partition named archetype is a concrete Archetype on `t`.
26
+ t.archetypes.Mob.columns;
27
+ t.archetypes.Mob.insert({ position: 1, health: 100 });
28
+ // ensureArchetype on `t` discriminates just like on the store.
29
+ const router = t.ensureArchetype(["id", "cell", "position"]);
30
+ router.insert({ cell: 1, position: 2 });
31
+ // @ts-expect-error - a partition family (Router) has no columns
32
+ router.columns;
33
+ const concrete = t.ensureArchetype(["id", "cell", "position"], { cell: 7 });
34
+ concrete.columns;
35
+ // @ts-expect-error - partition value must match the component type (cell is number)
36
+ t.ensureArchetype(["id", "cell", "position"], { cell: "nope" });
37
+ },
38
+ },
39
+ });
40
+ }
41
+ //# sourceMappingURL=database.partition.type-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.partition.type-test.js","sourceRoot":"","sources":["../../../src/ecs/database/database.partition.type-test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,yEAAyE;AACzE,sEAAsE;AACtE,sEAAsE;AACtE,oDAAoD;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,SAAS,iCAAiC;IACtC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;YAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC7B;QACD,UAAU,EAAE;YACR,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAI,mBAAmB;YACpD,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAM,WAAW;SAC/C;QACD,YAAY,EAAE;YACV,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;gBACT,uEAAuE;gBACvE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtD,sFAAsF;gBACtF,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;gBAE7B,kEAAkE;gBAClE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAEtD,+DAA+D;gBAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBAC7D,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxC,gEAAgE;gBAChE,MAAM,CAAC,OAAO,CAAC;gBAEf,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5E,QAAQ,CAAC,OAAO,CAAC;gBAEjB,oFAAoF;gBACpF,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC"}