@adobe/data 0.9.46 → 0.9.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ecs/archetype/archetype.d.ts +1 -1
- package/dist/ecs/archetype/create-archetype.d.ts +1 -1
- package/dist/ecs/archetype/create-archetype.test.js +1 -1
- package/dist/ecs/archetype/create-archetype.test.js.map +1 -1
- package/dist/ecs/archetype/delete-row.test.js +1 -1
- package/dist/ecs/archetype/delete-row.test.js.map +1 -1
- package/dist/ecs/database/database.d.ts +1 -1
- package/dist/ecs/database/observed/create-observed-database.js +9 -2
- package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
- package/dist/ecs/database/observed/observed-database.d.ts +1 -1
- package/dist/ecs/database/reconciling/reconciling-entry.d.ts +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.js +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js +28 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.js +22 -8
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js +177 -0
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +4 -1
- package/dist/ecs/entity/entity.d.ts +4 -0
- package/dist/ecs/entity/entity.js +2 -0
- package/dist/ecs/entity/entity.js.map +1 -0
- package/dist/ecs/entity/is-ephemeral.d.ts +2 -0
- package/dist/ecs/entity/is-ephemeral.js +2 -0
- package/dist/ecs/entity/is-ephemeral.js.map +1 -0
- package/dist/ecs/entity/is-ephemeral.test.d.ts +1 -0
- package/dist/ecs/entity/is-ephemeral.test.js +15 -0
- package/dist/ecs/entity/is-ephemeral.test.js.map +1 -0
- package/dist/ecs/entity/public.d.ts +2 -0
- package/dist/ecs/entity/public.js +4 -0
- package/dist/ecs/entity/public.js.map +1 -0
- package/dist/ecs/entity/schema.d.ts +6 -0
- package/dist/ecs/entity/schema.js +4 -0
- package/dist/ecs/entity/schema.js.map +1 -0
- package/dist/ecs/entity-location-table/entity-location-table.d.ts +1 -1
- package/dist/ecs/entity.d.ts +1 -0
- package/dist/ecs/entity.js +1 -0
- package/dist/ecs/entity.js.map +1 -1
- package/dist/ecs/index.d.ts +1 -1
- package/dist/ecs/index.js +1 -1
- package/dist/ecs/index.js.map +1 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.js +1 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.js.map +1 -1
- package/dist/ecs/required-components.d.ts +1 -1
- package/dist/ecs/store/core/core.d.ts +1 -1
- package/dist/ecs/store/core/create-core.js +1 -1
- package/dist/ecs/store/core/create-core.js.map +1 -1
- package/dist/ecs/store/core/select-entities.d.ts +1 -1
- package/dist/ecs/store/public/create-store.js +9 -2
- package/dist/ecs/store/public/create-store.js.map +1 -1
- package/dist/ecs/store/store.d.ts +1 -1
- package/dist/ecs/store/transaction-functions.d.ts +1 -1
- package/dist/observe/public.d.ts +1 -0
- package/dist/observe/public.js +1 -0
- package/dist/observe/public.js.map +1 -1
- package/dist/observe/with-switch.d.ts +18 -0
- package/dist/observe/with-switch.js +45 -0
- package/dist/observe/with-switch.js.map +1 -0
- package/dist/observe/with-switch.test.d.ts +1 -0
- package/dist/observe/with-switch.test.js +142 -0
- package/dist/observe/with-switch.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/references/data-lit/package.json +1 -1
- package/references/data-lit-tictactoe/package.json +1 -1
- package/references/data-react/package.json +1 -1
- package/references/data-react-hello/package.json +1 -1
- package/references/data-react-pixie/package.json +1 -1
|
@@ -25,9 +25,16 @@ export function createStore(schema) {
|
|
|
25
25
|
// The resource component we added above will contain the resource value
|
|
26
26
|
const ensureResourceInitialized = (name, resourceSchema) => {
|
|
27
27
|
const resourceId = name;
|
|
28
|
-
const
|
|
28
|
+
const isEphemeral = resourceSchema.ephemeral;
|
|
29
|
+
const componentNames = isEphemeral
|
|
30
|
+
? ["id", resourceId, "ephemeral"]
|
|
31
|
+
: ["id", resourceId];
|
|
32
|
+
const archetype = core.ensureArchetype(componentNames);
|
|
29
33
|
if (archetype.rowCount === 0) {
|
|
30
|
-
|
|
34
|
+
const insertValues = isEphemeral
|
|
35
|
+
? { [resourceId]: resourceSchema.default, ephemeral: true }
|
|
36
|
+
: { [resourceId]: resourceSchema.default };
|
|
37
|
+
archetype.insert(insertValues);
|
|
31
38
|
}
|
|
32
39
|
if (!Object.prototype.hasOwnProperty.call(resources, name)) {
|
|
33
40
|
const row = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-store.js","sourceRoot":"","sources":["../../../../src/ecs/store/public/create-store.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAQvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,UAAU,WAAW,CAKvB,MAAgC;IAEhC,MAAM,SAAS,GAAG,MAAa,CAAC;IAChC,MAAM,cAAc,GAChB,SAAS;QACT,OAAO,SAAS,KAAK,QAAQ;QAC7B,YAAY,IAAI,SAAS;QACzB,WAAW,IAAI,SAAS;QACxB,YAAY,IAAI,SAAS,CAAC;IAE9B,MAAM,gBAAgB,GAA4B,cAAc;QAC5D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC;YACE,UAAU,EAAE,EAAQ;YACpB,SAAS,EAAE,EAAQ;YACnB,UAAU,EAAE,EAAO;SACtB,CAAC;IAKN,MAAM,SAAS,GAAG,EAAO,CAAC;IAC1B,MAAM,gBAAgB,GAAG,EAAQ,CAAC;IAClC,MAAM,eAAe,GAAG,EAAQ,CAAC;IACjC,MAAM,uBAAuB,GAAG,EAAO,CAAC;IACxC,MAAM,2BAA2B,GAA0C,EAAS,CAAC;IAErF,MAAM,IAAI,GAAG,UAAU,CAAC,2BAA2B,CAAuB,CAAC;IAE3E,0FAA0F;IAC1F,wEAAwE;IACxE,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAE,cAA6C,EAAE,EAAE;QAC9F,MAAM,UAAU,GAAG,IAAsB,CAAC;QAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"create-store.js","sourceRoot":"","sources":["../../../../src/ecs/store/public/create-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { RequiredComponents } from "../required-components.js";
|
|
2
2
|
import { ResourceComponents } from "./resource-components.js";
|
|
3
3
|
import { Core, ReadonlyCore } from "./core/core.js";
|
|
4
|
-
import { Entity } from "../entity.js";
|
|
4
|
+
import { Entity } from "../entity/entity.js";
|
|
5
5
|
import { IntersectTuple, Simplify, StringKeyof } from "../../types/types.js";
|
|
6
6
|
import { Components } from "./components.js";
|
|
7
7
|
import { ArchetypeComponents } from "./archetype-components.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Store } from "./store.js";
|
|
2
|
-
import { Entity } from "../entity.js";
|
|
2
|
+
import { Entity } from "../entity/entity.js";
|
|
3
3
|
import { Components } from "./components.js";
|
|
4
4
|
import { ResourceComponents } from "./resource-components.js";
|
|
5
5
|
import { ArchetypeComponents } from "./archetype-components.js";
|
package/dist/observe/public.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export * from "./with-async-map.js";
|
|
|
23
23
|
export * from "./with-map.js";
|
|
24
24
|
export * from "./with-map-data.js";
|
|
25
25
|
export * from "./with-optional.js";
|
|
26
|
+
export * from "./with-switch.js";
|
|
26
27
|
export * from "./with-unwrap.js";
|
|
27
28
|
export * from "./with-lazy.js";
|
|
28
29
|
export * from "./with-batch.js";
|
package/dist/observe/public.js
CHANGED
|
@@ -24,6 +24,7 @@ export * from "./with-async-map.js";
|
|
|
24
24
|
export * from "./with-map.js";
|
|
25
25
|
export * from "./with-map-data.js";
|
|
26
26
|
export * from "./with-optional.js";
|
|
27
|
+
export * from "./with-switch.js";
|
|
27
28
|
export * from "./with-unwrap.js";
|
|
28
29
|
export * from "./with-lazy.js";
|
|
29
30
|
export * from "./with-batch.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/observe/public.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/observe/public.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Observe } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamically switches between observables in a record based on a key observable.
|
|
4
|
+
* When the key changes, automatically unsubscribes from the previous observable and subscribes to the new one.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const data = {
|
|
9
|
+
* home: homeData$,
|
|
10
|
+
* profile: profileData$,
|
|
11
|
+
* settings: settingsData$
|
|
12
|
+
* };
|
|
13
|
+
* const currentTab$ = createState('home');
|
|
14
|
+
* const currentData$ = withSwitch(data, currentTab$);
|
|
15
|
+
* // When currentTab$ changes, automatically switches to observing the corresponding data observable
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function withSwitch<K extends string, T extends Record<K, Observe<any>>>(record: T, key: Observe<K>): Observe<T[K] extends Observe<infer U> ? U : never>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamically switches between observables in a record based on a key observable.
|
|
3
|
+
* When the key changes, automatically unsubscribes from the previous observable and subscribes to the new one.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const data = {
|
|
8
|
+
* home: homeData$,
|
|
9
|
+
* profile: profileData$,
|
|
10
|
+
* settings: settingsData$
|
|
11
|
+
* };
|
|
12
|
+
* const currentTab$ = createState('home');
|
|
13
|
+
* const currentData$ = withSwitch(data, currentTab$);
|
|
14
|
+
* // When currentTab$ changes, automatically switches to observing the corresponding data observable
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function withSwitch(record, key) {
|
|
18
|
+
return (observer) => {
|
|
19
|
+
let currentUnsubscribe = null;
|
|
20
|
+
const keyUnsubscribe = key((selectedKey) => {
|
|
21
|
+
// Unsubscribe from the previous observable before subscribing to the new one
|
|
22
|
+
currentUnsubscribe?.();
|
|
23
|
+
if (currentUnsubscribe) {
|
|
24
|
+
currentUnsubscribe();
|
|
25
|
+
currentUnsubscribe = null;
|
|
26
|
+
}
|
|
27
|
+
// Validate that the key exists in the record
|
|
28
|
+
if (!(selectedKey in record)) {
|
|
29
|
+
throw new Error(`Key "${selectedKey}" not found in observable record. Available keys: ${Object.keys(record).join(", ")}`);
|
|
30
|
+
}
|
|
31
|
+
// Subscribe to the newly selected observable
|
|
32
|
+
const selectedObservable = record[selectedKey];
|
|
33
|
+
currentUnsubscribe = selectedObservable(observer);
|
|
34
|
+
});
|
|
35
|
+
// Return a new unsubscribe function that unsubscribes from both the key observable and current selected observable
|
|
36
|
+
return () => {
|
|
37
|
+
keyUnsubscribe();
|
|
38
|
+
if (currentUnsubscribe) {
|
|
39
|
+
currentUnsubscribe();
|
|
40
|
+
currentUnsubscribe = null;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=with-switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-switch.js","sourceRoot":"","sources":["../../src/observe/with-switch.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU,CACxB,MAAS,EACT,GAAe;IAEf,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,IAAI,kBAAkB,GAAqB,IAAI,CAAC;QAEhD,MAAM,cAAc,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;YACzC,6EAA6E;YAC7E,kBAAkB,EAAE,EAAE,CAAC;YACvB,IAAI,kBAAkB,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,QAAQ,WAAW,qDAAqD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzG,CAAC;YACJ,CAAC;YAED,6CAA6C;YAC7C,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/C,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,mHAAmH;QACnH,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,IAAI,kBAAkB,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
import { describe, test, expect, assertType } from "vitest";
|
|
3
|
+
import { withSwitch } from "./with-switch.js";
|
|
4
|
+
import { fromConstant } from "./from-constant.js";
|
|
5
|
+
import { createState } from "./create-state.js";
|
|
6
|
+
describe("withSwitch", () => {
|
|
7
|
+
test("should switch and observe the selected observable", () => {
|
|
8
|
+
const record = {
|
|
9
|
+
a: fromConstant(1),
|
|
10
|
+
b: fromConstant(2),
|
|
11
|
+
c: fromConstant(3),
|
|
12
|
+
};
|
|
13
|
+
const key = fromConstant("b");
|
|
14
|
+
const picked = withSwitch(record, key);
|
|
15
|
+
let result;
|
|
16
|
+
picked((value) => {
|
|
17
|
+
result = value;
|
|
18
|
+
})();
|
|
19
|
+
expect(result).toBe(2);
|
|
20
|
+
});
|
|
21
|
+
test("should switch observables when key changes", () => {
|
|
22
|
+
const record = {
|
|
23
|
+
a: fromConstant(10),
|
|
24
|
+
b: fromConstant(20),
|
|
25
|
+
c: fromConstant(30),
|
|
26
|
+
};
|
|
27
|
+
const [key, setKey] = createState("a");
|
|
28
|
+
const picked = withSwitch(record, key);
|
|
29
|
+
const values = [];
|
|
30
|
+
const unsubscribe = picked((value) => {
|
|
31
|
+
values.push(value);
|
|
32
|
+
});
|
|
33
|
+
setKey("b");
|
|
34
|
+
setKey("c");
|
|
35
|
+
unsubscribe();
|
|
36
|
+
expect(values).toEqual([10, 20, 30]);
|
|
37
|
+
});
|
|
38
|
+
test("should unsubscribe from previous observable when key changes", () => {
|
|
39
|
+
const [observableA, setA] = createState(100);
|
|
40
|
+
const [observableB, setB] = createState(200);
|
|
41
|
+
const record = { a: observableA, b: observableB };
|
|
42
|
+
const [key, setKey] = createState("a");
|
|
43
|
+
const picked = withSwitch(record, key);
|
|
44
|
+
const values = [];
|
|
45
|
+
const unsubscribe = picked((value) => {
|
|
46
|
+
values.push(value);
|
|
47
|
+
});
|
|
48
|
+
setA(101); // Should be observed
|
|
49
|
+
setKey("b"); // Switch to b
|
|
50
|
+
setA(102); // Should NOT be observed (unsubscribed from a)
|
|
51
|
+
setB(201); // Should be observed
|
|
52
|
+
unsubscribe();
|
|
53
|
+
expect(values).toEqual([100, 101, 200, 201]);
|
|
54
|
+
});
|
|
55
|
+
test("should clean up all subscriptions on unobserve", () => {
|
|
56
|
+
const [observableA, setA] = createState(1);
|
|
57
|
+
const [observableB, setB] = createState(2);
|
|
58
|
+
const record = { a: observableA, b: observableB };
|
|
59
|
+
const [key, setKey] = createState("a");
|
|
60
|
+
const picked = withSwitch(record, key);
|
|
61
|
+
const values = [];
|
|
62
|
+
const unsubscribe = picked((value) => {
|
|
63
|
+
values.push(value);
|
|
64
|
+
});
|
|
65
|
+
setA(10);
|
|
66
|
+
unsubscribe();
|
|
67
|
+
// After unsubscribe, no further notifications
|
|
68
|
+
setA(20);
|
|
69
|
+
setB(30);
|
|
70
|
+
setKey("b");
|
|
71
|
+
expect(values).toEqual([1, 10]);
|
|
72
|
+
});
|
|
73
|
+
test("should handle rapid key changes", () => {
|
|
74
|
+
const record = {
|
|
75
|
+
x: fromConstant("first"),
|
|
76
|
+
y: fromConstant("second"),
|
|
77
|
+
z: fromConstant("third"),
|
|
78
|
+
};
|
|
79
|
+
const [key, setKey] = createState("x");
|
|
80
|
+
const picked = withSwitch(record, key);
|
|
81
|
+
const values = [];
|
|
82
|
+
const unsubscribe = picked((value) => {
|
|
83
|
+
values.push(value);
|
|
84
|
+
});
|
|
85
|
+
setKey("y");
|
|
86
|
+
setKey("z");
|
|
87
|
+
setKey("x");
|
|
88
|
+
setKey("z");
|
|
89
|
+
unsubscribe();
|
|
90
|
+
expect(values).toEqual(["first", "second", "third", "first", "third"]);
|
|
91
|
+
});
|
|
92
|
+
test("should throw error when key is not in record", () => {
|
|
93
|
+
const record = {
|
|
94
|
+
a: fromConstant(1),
|
|
95
|
+
b: fromConstant(2),
|
|
96
|
+
};
|
|
97
|
+
const [key, setKey] = createState("a");
|
|
98
|
+
const picked = withSwitch(record, key);
|
|
99
|
+
const unsubscribe = picked(() => { });
|
|
100
|
+
expect(() => {
|
|
101
|
+
setKey("invalid");
|
|
102
|
+
}).toThrow('Key "invalid" not found in observable record');
|
|
103
|
+
unsubscribe();
|
|
104
|
+
});
|
|
105
|
+
test("type inference: should infer union type from subset of keys", () => {
|
|
106
|
+
// Compile-time type test
|
|
107
|
+
const record = {
|
|
108
|
+
a: fromConstant(true),
|
|
109
|
+
b: fromConstant("hello"),
|
|
110
|
+
c: fromConstant(42),
|
|
111
|
+
};
|
|
112
|
+
const key = fromConstant("a");
|
|
113
|
+
const result = withSwitch(record, key);
|
|
114
|
+
// Type should be Observe<boolean | string>, not Observe<boolean | string | number>
|
|
115
|
+
assertType(result);
|
|
116
|
+
});
|
|
117
|
+
test("type inference: should work with all keys", () => {
|
|
118
|
+
// Compile-time type test
|
|
119
|
+
const record = {
|
|
120
|
+
a: fromConstant(true),
|
|
121
|
+
b: fromConstant("hello"),
|
|
122
|
+
c: fromConstant(42),
|
|
123
|
+
};
|
|
124
|
+
const key = fromConstant("a");
|
|
125
|
+
const result = withSwitch(record, key);
|
|
126
|
+
// Type should be Observe<boolean | string | number>
|
|
127
|
+
assertType(result);
|
|
128
|
+
});
|
|
129
|
+
test("type inference: should work with single key", () => {
|
|
130
|
+
// Compile-time type test
|
|
131
|
+
const record = {
|
|
132
|
+
a: fromConstant(true),
|
|
133
|
+
b: fromConstant("hello"),
|
|
134
|
+
c: fromConstant(42),
|
|
135
|
+
};
|
|
136
|
+
const key = fromConstant("b");
|
|
137
|
+
const result = withSwitch(record, key);
|
|
138
|
+
// Type should be Observe<string>
|
|
139
|
+
assertType(result);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=with-switch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-switch.test.js","sourceRoot":"","sources":["../../src/observe/with-switch.test.ts"],"names":[],"mappings":"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"}
|