@assistant-ui/store 0.1.6 → 0.2.1
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/README.md +9 -10
- package/dist/AuiIf.d.ts.map +1 -1
- package/dist/AuiIf.js.map +1 -1
- package/dist/attachTransformScopes.d.ts +11 -0
- package/dist/attachTransformScopes.d.ts.map +1 -0
- package/dist/attachTransformScopes.js +12 -0
- package/dist/attachTransformScopes.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/tapClientList.d.ts +9 -5
- package/dist/tapClientList.d.ts.map +1 -1
- package/dist/tapClientList.js.map +1 -1
- package/dist/tapClientLookup.d.ts +7 -3
- package/dist/tapClientLookup.d.ts.map +1 -1
- package/dist/tapClientLookup.js +2 -2
- package/dist/tapClientLookup.js.map +1 -1
- package/dist/tapClientResource.d.ts +9 -24
- package/dist/tapClientResource.d.ts.map +1 -1
- package/dist/tapClientResource.js +11 -19
- package/dist/tapClientResource.js.map +1 -1
- package/dist/types/client.d.ts +23 -27
- package/dist/types/client.d.ts.map +1 -1
- package/dist/useAui.d.ts.map +1 -1
- package/dist/useAui.js +4 -4
- package/dist/useAui.js.map +1 -1
- package/dist/useAuiState.d.ts +1 -1
- package/dist/useAuiState.d.ts.map +1 -1
- package/dist/useAuiState.js +1 -1
- package/dist/useAuiState.js.map +1 -1
- package/dist/utils/proxied-assistant-state.d.ts.map +1 -1
- package/dist/utils/proxied-assistant-state.js.map +1 -1
- package/dist/utils/splitClients.d.ts.map +1 -1
- package/dist/utils/splitClients.js +25 -55
- package/dist/utils/splitClients.js.map +1 -1
- package/package.json +11 -4
- package/src/__tests__/hooks.test.tsx +126 -0
- package/src/attachTransformScopes.ts +38 -0
- package/src/index.ts +18 -9
- package/src/tapClientList.ts +13 -10
- package/src/tapClientLookup.ts +17 -14
- package/src/tapClientResource.ts +36 -31
- package/src/types/client.ts +41 -47
- package/src/{useAui.tsx → useAui.ts} +5 -6
- package/src/{useAuiState.tsx → useAuiState.ts} +2 -2
- package/src/utils/splitClients.ts +32 -82
- package/dist/attachDefaultPeers.d.ts +0 -56
- package/dist/attachDefaultPeers.d.ts.map +0 -1
- package/dist/attachDefaultPeers.js +0 -51
- package/dist/attachDefaultPeers.js.map +0 -1
- package/src/attachDefaultPeers.ts +0 -78
- /package/src/{AuiIf.tsx → AuiIf.ts} +0 -0
- /package/src/utils/{proxied-assistant-state.tsx → proxied-assistant-state.ts} +0 -0
package/dist/useAui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.
|
|
1
|
+
{"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"}
|
package/dist/useAuiState.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import type { AssistantState } from "./types/client.js";
|
|
|
11
11
|
* foo: RootScope({ ... }),
|
|
12
12
|
* });
|
|
13
13
|
*
|
|
14
|
-
* const bar = useAuiState((
|
|
14
|
+
* const bar = useAuiState((s) => s.foo.bar);
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
export declare const useAuiState: <T>(selector: (state: AssistantState) => T) => T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuiState.d.ts","sourceRoot":"","sources":["../src/useAuiState.
|
|
1
|
+
{"version":3,"file":"useAuiState.d.ts","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAIrD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KAAG,CAmBvE,CAAC"}
|
package/dist/useAuiState.js
CHANGED
|
@@ -13,7 +13,7 @@ import { getProxiedAssistantState } from "./utils/proxied-assistant-state.js";
|
|
|
13
13
|
* foo: RootScope({ ... }),
|
|
14
14
|
* });
|
|
15
15
|
*
|
|
16
|
-
* const bar = useAuiState((
|
|
16
|
+
* const bar = useAuiState((s) => s.foo.bar);
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
19
|
export const useAuiState = (selector) => {
|
package/dist/useAuiState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuiState.js","sourceRoot":"","sources":["../src/useAuiState.
|
|
1
|
+
{"version":3,"file":"useAuiState.js","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,wBAAwB,EAAE,2CAAwC;AAE3E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAsC,EAAK,EAAE;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,YAAY,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,oBAAoB,CAChC,GAAG,CAAC,SAAS,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7B,CAAC;IAEF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxied-assistant-state.d.ts","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.
|
|
1
|
+
{"version":3,"file":"proxied-assistant-state.d.ts","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,2BAAwB;AAGvE,eAAO,MAAM,8BAA8B,eAE1C,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,KACtB,cA0BF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,eAAe,KACtB,cAIF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxied-assistant-state.js","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.
|
|
1
|
+
{"version":3,"file":"proxied-assistant-state.js","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,cAAc,EAAE,gCAA6B;AAEtD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,8BAA2B;AAE/E,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAClD,0CAA0C,CAC3C,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAoB,EAA6B,EAAE;IACvE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;AACxE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,MAAuB,EACP,EAAE;IAClB,MAAM,iCACJ,SAAQ,gBAAgB;QAGxB,GAAG,CAAC,CAAU,EAAE,IAAqB;YACnC,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACtE,IAAI,aAAa,KAAK,KAAK;gBAAE,OAAO,aAAa,CAAC;YAClD,MAAM,KAAK,GAAG,IAA6B,CAAC;YAC5C,IAAI,YAAY,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC1C,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,GAAG,CAAC,CAAU,EAAE,IAAqB;YACnC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;QAC/C,CAAC;KACF;IAED,OAAO,IAAI,KAAK,CACd,EAAoB,EACpB,IAAI,iCAAiC,EAAE,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAAuB,EACP,EAAE;IAClB,OACE,MACD,CAAC,8BAA8B,CAAC,CAAC;AACpC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splitClients.d.ts","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAE,sBAAmB;AACrD,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,2BAAwB;AAEzB,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAkB;AAGxC,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CACjD,CAAC;
|
|
1
|
+
{"version":3,"file":"splitClients.d.ts","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAE,sBAAmB;AACrD,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,2BAAwB;AAEzB,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAkB;AAGxC,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CACjD,CAAC;AAsDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,KAAK,EACrB,YAAY,eAAe;;;CAQ5B,CAAC"}
|
|
@@ -1,28 +1,35 @@
|
|
|
1
1
|
import { Derived } from "../Derived.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getTransformScopes } from "../attachTransformScopes.js";
|
|
3
3
|
import { tapMemo } from "@assistant-ui/tap";
|
|
4
4
|
/**
|
|
5
|
-
* Splits a clients object into root clients and derived clients
|
|
6
|
-
*
|
|
7
|
-
* @param clients - The clients input object to split
|
|
8
|
-
* @returns An object with { rootClients, derivedClients }
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const clients = {
|
|
13
|
-
* foo: RootClient({ ... }),
|
|
14
|
-
* bar: Derived({ ... }),
|
|
15
|
-
* };
|
|
16
|
-
*
|
|
17
|
-
* const { rootClients, derivedClients } = splitClients(clients);
|
|
18
|
-
* // rootClients = { foo: ... }
|
|
19
|
-
* // derivedClients = { bar: ... }
|
|
20
|
-
* ```
|
|
5
|
+
* Splits a clients object into root clients and derived clients,
|
|
6
|
+
* applying transformScopes from root client elements.
|
|
21
7
|
*/
|
|
22
8
|
function splitClients(clients, baseClient) {
|
|
9
|
+
// 1. Collect transforms from root elements and run them iteratively
|
|
10
|
+
let scopes = { ...clients };
|
|
11
|
+
const visited = new Set();
|
|
12
|
+
let changed = true;
|
|
13
|
+
while (changed) {
|
|
14
|
+
changed = false;
|
|
15
|
+
for (const clientElement of Object.values(scopes)) {
|
|
16
|
+
if (clientElement.type === Derived)
|
|
17
|
+
continue;
|
|
18
|
+
if (visited.has(clientElement.type))
|
|
19
|
+
continue;
|
|
20
|
+
visited.add(clientElement.type);
|
|
21
|
+
const transform = getTransformScopes(clientElement.type);
|
|
22
|
+
if (transform) {
|
|
23
|
+
scopes = transform(scopes, baseClient);
|
|
24
|
+
changed = true;
|
|
25
|
+
break; // restart iteration since scopes may have new root elements
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// 2. Split result into root/derived
|
|
23
30
|
const rootClients = {};
|
|
24
31
|
const derivedClients = {};
|
|
25
|
-
for (const [key, clientElement] of Object.entries(
|
|
32
|
+
for (const [key, clientElement] of Object.entries(scopes)) {
|
|
26
33
|
if (clientElement.type === Derived) {
|
|
27
34
|
derivedClients[key] = clientElement;
|
|
28
35
|
}
|
|
@@ -30,43 +37,6 @@ function splitClients(clients, baseClient) {
|
|
|
30
37
|
rootClients[key] = clientElement;
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
|
-
// Recursively gather all default peers, flattening nested ones
|
|
34
|
-
const gatherDefaultPeers = (clientElement, visited = new Set()) => {
|
|
35
|
-
// Prevent infinite loops
|
|
36
|
-
if (visited.has(clientElement))
|
|
37
|
-
return [];
|
|
38
|
-
visited.add(clientElement);
|
|
39
|
-
const defaultPeers = getDefaultPeers(clientElement.type);
|
|
40
|
-
if (!defaultPeers)
|
|
41
|
-
return [];
|
|
42
|
-
const result = [];
|
|
43
|
-
for (const [key, peerElement] of Object.entries(defaultPeers)) {
|
|
44
|
-
result.push([key, peerElement]);
|
|
45
|
-
// If this peer is a root client with its own default peers, recursively gather them
|
|
46
|
-
if (peerElement.type !== (Derived)) {
|
|
47
|
-
const nestedPeers = gatherDefaultPeers(peerElement, visited);
|
|
48
|
-
result.push(...nestedPeers);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return result;
|
|
52
|
-
};
|
|
53
|
-
// Apply flattened default peers for each root client
|
|
54
|
-
for (const [_clientKey, clientElement] of Object.entries(rootClients)) {
|
|
55
|
-
const allPeers = gatherDefaultPeers(clientElement);
|
|
56
|
-
for (const [key, peerElement] of allPeers) {
|
|
57
|
-
// Skip if already exists (first wins)
|
|
58
|
-
if (key in rootClients ||
|
|
59
|
-
key in derivedClients ||
|
|
60
|
-
baseClient[key].source !== null)
|
|
61
|
-
continue;
|
|
62
|
-
if (peerElement.type === (Derived)) {
|
|
63
|
-
derivedClients[key] = peerElement;
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
rootClients[key] = peerElement;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
40
|
return { rootClients, derivedClients };
|
|
71
41
|
}
|
|
72
42
|
const tapShallowMemoObject = (object) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splitClients.js","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,sBAAmB;AAMrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"splitClients.js","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,sBAAmB;AAMrD,OAAO,EAAE,kBAAkB,EAAE,oCAAiC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS5C;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAqB,EAAE,UAA2B;IACtE,oEAAoE;IACpE,IAAI,MAAM,GAAG,EAAE,GAAG,OAAO,EAGxB,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB;gBAAE,SAAS;YAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAkB,CAAC;gBACxD,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,4DAA4D;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGrD,EAAE,CAAC;QACJ,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB,EAAE,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,GAAG,aAA4C,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,aAA2C,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAmB,MAAS,EAAE,EAAE;IAC3D,wEAAwE;IACxE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAqB,EACrB,UAA2B,EAC3B,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1E,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC9C,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC;KACrD,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/store",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Tap-based state management for @assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"state-management",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
],
|
|
29
29
|
"sideEffects": false,
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@assistant-ui/tap": "^0.4.5",
|
|
32
31
|
"use-effect-event": "^2.0.3"
|
|
33
32
|
},
|
|
34
33
|
"peerDependencies": {
|
|
34
|
+
"@assistant-ui/tap": "^0.5.1",
|
|
35
35
|
"@types/react": "*",
|
|
36
36
|
"react": "^18 || ^19"
|
|
37
37
|
},
|
|
@@ -41,8 +41,13 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@
|
|
44
|
+
"@testing-library/react": "^16.3.2",
|
|
45
|
+
"@types/react": "^19.2.14",
|
|
46
|
+
"@types/react-dom": "^19.2.3",
|
|
47
|
+
"jsdom": "^28.1.0",
|
|
48
|
+
"vitest": "^4.0.18",
|
|
45
49
|
"react": "^19.2.4",
|
|
50
|
+
"@assistant-ui/tap": "0.5.1",
|
|
46
51
|
"@assistant-ui/x-buildutils": "0.0.1"
|
|
47
52
|
},
|
|
48
53
|
"publishConfig": {
|
|
@@ -59,6 +64,8 @@
|
|
|
59
64
|
"url": "https://github.com/assistant-ui/assistant-ui/issues"
|
|
60
65
|
},
|
|
61
66
|
"scripts": {
|
|
62
|
-
"build": "aui-build"
|
|
67
|
+
"build": "aui-build",
|
|
68
|
+
"test": "vitest run",
|
|
69
|
+
"test:watch": "vitest"
|
|
63
70
|
}
|
|
64
71
|
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import type { ReactNode } from "react";
|
|
4
|
+
import { act, renderHook } from "@testing-library/react";
|
|
5
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { AuiProvider } from "../utils/react-assistant-context";
|
|
7
|
+
import { useAuiState } from "../useAuiState";
|
|
8
|
+
import { useAuiEvent } from "../useAuiEvent";
|
|
9
|
+
import { PROXIED_ASSISTANT_STATE_SYMBOL } from "../utils/proxied-assistant-state";
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
type Listener = () => void;
|
|
16
|
+
type EventEntry = {
|
|
17
|
+
selector: { scope: string; event: string };
|
|
18
|
+
callback: (payload: unknown) => void;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const createTestAuiClient = (initialState: Record<string, unknown>) => {
|
|
22
|
+
const listeners = new Set<Listener>();
|
|
23
|
+
const eventEntries: EventEntry[] = [];
|
|
24
|
+
const state = initialState;
|
|
25
|
+
|
|
26
|
+
const client = {
|
|
27
|
+
subscribe: (listener: Listener) => {
|
|
28
|
+
listeners.add(listener);
|
|
29
|
+
return () => listeners.delete(listener);
|
|
30
|
+
},
|
|
31
|
+
on: (
|
|
32
|
+
selector: { scope: string; event: string },
|
|
33
|
+
callback: (payload: unknown) => void,
|
|
34
|
+
) => {
|
|
35
|
+
eventEntries.push({ selector, callback });
|
|
36
|
+
return () => {
|
|
37
|
+
const idx = eventEntries.findIndex(
|
|
38
|
+
(entry) => entry.callback === callback,
|
|
39
|
+
);
|
|
40
|
+
if (idx >= 0) eventEntries.splice(idx, 1);
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
[PROXIED_ASSISTANT_STATE_SYMBOL]: state,
|
|
44
|
+
} as const;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
client,
|
|
48
|
+
state,
|
|
49
|
+
notify: () => listeners.forEach((listener) => listener()),
|
|
50
|
+
emitEvent: (event: string, payload: unknown) => {
|
|
51
|
+
for (const entry of eventEntries) {
|
|
52
|
+
if (entry.selector.event === event) {
|
|
53
|
+
entry.callback(payload);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
getEventEntries: () => eventEntries.slice(),
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
describe("store hooks", () => {
|
|
62
|
+
it("useAuiState subscribes and updates selected state", () => {
|
|
63
|
+
const testClient = createTestAuiClient({ counter: 1 });
|
|
64
|
+
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
65
|
+
<AuiProvider value={testClient.client as never}>{children}</AuiProvider>
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const { result } = renderHook(() => useAuiState((s: any) => s.counter), {
|
|
69
|
+
wrapper,
|
|
70
|
+
});
|
|
71
|
+
expect(result.current).toBe(1);
|
|
72
|
+
|
|
73
|
+
act(() => {
|
|
74
|
+
testClient.state.counter = 2;
|
|
75
|
+
testClient.notify();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(result.current).toBe(2);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("useAuiState throws when selector returns full state", () => {
|
|
82
|
+
const testClient = createTestAuiClient({ counter: 1 });
|
|
83
|
+
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
84
|
+
<AuiProvider value={testClient.client as never}>{children}</AuiProvider>
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
expect(() => {
|
|
88
|
+
renderHook(() => useAuiState((s: any) => s), { wrapper });
|
|
89
|
+
}).toThrow(
|
|
90
|
+
"You tried to return the entire AssistantState. This is not supported due to technical limitations.",
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("useAuiEvent subscribes with normalized selector and invokes latest callback", () => {
|
|
95
|
+
const testClient = createTestAuiClient({ counter: 1 });
|
|
96
|
+
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
97
|
+
<AuiProvider value={testClient.client as never}>{children}</AuiProvider>
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const firstCallback = vi.fn();
|
|
101
|
+
const secondCallback = vi.fn();
|
|
102
|
+
|
|
103
|
+
const { rerender } = renderHook(
|
|
104
|
+
({ cb }) => useAuiEvent("thread.updated" as any, cb as any),
|
|
105
|
+
{
|
|
106
|
+
wrapper,
|
|
107
|
+
initialProps: { cb: firstCallback },
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const [entry] = testClient.getEventEntries();
|
|
112
|
+
expect(entry?.selector).toEqual({
|
|
113
|
+
scope: "thread",
|
|
114
|
+
event: "thread.updated",
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
rerender({ cb: secondCallback });
|
|
118
|
+
|
|
119
|
+
act(() => {
|
|
120
|
+
testClient.emitEvent("thread.updated", { id: "t-1" });
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
expect(firstCallback).not.toHaveBeenCalled();
|
|
124
|
+
expect(secondCallback).toHaveBeenCalledWith({ id: "t-1" });
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ResourceElement } from "@assistant-ui/tap";
|
|
2
|
+
import type {
|
|
3
|
+
AssistantClient,
|
|
4
|
+
ClientElement,
|
|
5
|
+
ClientNames,
|
|
6
|
+
} from "./types/client";
|
|
7
|
+
import type { DerivedElement } from "./Derived";
|
|
8
|
+
|
|
9
|
+
const TRANSFORM_SCOPES = Symbol("assistant-ui.transform-scopes");
|
|
10
|
+
|
|
11
|
+
export type ScopesConfig = {
|
|
12
|
+
[K in ClientNames]?: ClientElement<K> | DerivedElement<K>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type TransformScopesFn = (
|
|
16
|
+
scopes: ScopesConfig,
|
|
17
|
+
parent: AssistantClient,
|
|
18
|
+
) => ScopesConfig;
|
|
19
|
+
|
|
20
|
+
type ResourceWithTransformScopes = {
|
|
21
|
+
[TRANSFORM_SCOPES]?: TransformScopesFn;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function attachTransformScopes<
|
|
25
|
+
T extends (...args: any[]) => ResourceElement<any>,
|
|
26
|
+
>(resource: T, transform: TransformScopesFn): void {
|
|
27
|
+
const r = resource as T & ResourceWithTransformScopes;
|
|
28
|
+
if (r[TRANSFORM_SCOPES]) {
|
|
29
|
+
throw new Error("transformScopes is already attached to this resource");
|
|
30
|
+
}
|
|
31
|
+
r[TRANSFORM_SCOPES] = transform;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getTransformScopes<
|
|
35
|
+
T extends (...args: any[]) => ResourceElement<any>,
|
|
36
|
+
>(resource: T): TransformScopesFn | undefined {
|
|
37
|
+
return (resource as T & ResourceWithTransformScopes)[TRANSFORM_SCOPES];
|
|
38
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,7 +9,8 @@ export { AuiProvider } from "./utils/react-assistant-context";
|
|
|
9
9
|
|
|
10
10
|
// resources
|
|
11
11
|
export { Derived } from "./Derived";
|
|
12
|
-
export {
|
|
12
|
+
export { attachTransformScopes } from "./attachTransformScopes";
|
|
13
|
+
export type { ScopesConfig } from "./attachTransformScopes";
|
|
13
14
|
|
|
14
15
|
// tap hooks
|
|
15
16
|
export {
|
|
@@ -22,16 +23,24 @@ export { tapClientList } from "./tapClientList";
|
|
|
22
23
|
|
|
23
24
|
// types
|
|
24
25
|
export type {
|
|
25
|
-
|
|
26
|
+
ScopeRegistry,
|
|
26
27
|
ClientOutput,
|
|
28
|
+
ClientMethods,
|
|
29
|
+
ClientSchema,
|
|
30
|
+
ClientNames,
|
|
31
|
+
ClientEvents,
|
|
32
|
+
ClientMeta,
|
|
33
|
+
ClientElement,
|
|
34
|
+
Unsubscribe,
|
|
35
|
+
AssistantClientAccessor,
|
|
27
36
|
AssistantClient,
|
|
28
37
|
AssistantState,
|
|
29
38
|
} from "./types/client";
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
export {
|
|
40
|
+
normalizeEventSelector,
|
|
41
|
+
type AssistantEventName,
|
|
42
|
+
type AssistantEventCallback,
|
|
43
|
+
type AssistantEventPayload,
|
|
44
|
+
type AssistantEventSelector,
|
|
45
|
+
type AssistantEventScope,
|
|
36
46
|
} from "./types/events";
|
|
37
|
-
export type { DefaultPeers } from "./attachDefaultPeers";
|
package/src/tapClientList.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { tapConst, tapState, withKey } from "@assistant-ui/tap";
|
|
2
2
|
import type { ContravariantResource } from "@assistant-ui/tap";
|
|
3
3
|
import { tapClientLookup } from "./tapClientLookup";
|
|
4
|
-
import type { ClientMethods
|
|
4
|
+
import type { ClientMethods } from "./types/client";
|
|
5
|
+
|
|
6
|
+
type InferClientState<TMethods> = TMethods extends {
|
|
7
|
+
getState: () => infer S;
|
|
8
|
+
}
|
|
9
|
+
? S
|
|
10
|
+
: unknown;
|
|
5
11
|
|
|
6
12
|
type DataHandle<TData> = { data: TData | undefined; hasData: boolean };
|
|
7
13
|
|
|
@@ -24,10 +30,10 @@ const createProps = <TData>(
|
|
|
24
30
|
};
|
|
25
31
|
};
|
|
26
32
|
|
|
27
|
-
export const tapClientList = <TData,
|
|
28
|
-
props: tapClientList.Props<TData,
|
|
33
|
+
export const tapClientList = <TData, TMethods extends ClientMethods>(
|
|
34
|
+
props: tapClientList.Props<TData, TMethods>,
|
|
29
35
|
): {
|
|
30
|
-
state:
|
|
36
|
+
state: InferClientState<TMethods>[];
|
|
31
37
|
get: (lookup: { index: number } | { key: string }) => TMethods;
|
|
32
38
|
add: (initialData: TData) => void;
|
|
33
39
|
} => {
|
|
@@ -57,7 +63,7 @@ export const tapClientList = <TData, TState, TMethods extends ClientMethods>(
|
|
|
57
63
|
return Object.fromEntries(entries);
|
|
58
64
|
});
|
|
59
65
|
|
|
60
|
-
const lookup = tapClientLookup<
|
|
66
|
+
const lookup = tapClientLookup<TMethods>(
|
|
61
67
|
() =>
|
|
62
68
|
Object.values(items).map((props) => withKey(props.key, Resource(props))),
|
|
63
69
|
[items, Resource],
|
|
@@ -107,12 +113,9 @@ export namespace tapClientList {
|
|
|
107
113
|
remove: () => void;
|
|
108
114
|
};
|
|
109
115
|
|
|
110
|
-
export type Props<TData,
|
|
116
|
+
export type Props<TData, TMethods extends ClientMethods> = {
|
|
111
117
|
initialValues: TData[];
|
|
112
118
|
getKey: (data: TData) => string;
|
|
113
|
-
resource: ContravariantResource<
|
|
114
|
-
ClientOutputOf<TState, TMethods>,
|
|
115
|
-
ResourceProps<TData>
|
|
116
|
-
>;
|
|
119
|
+
resource: ContravariantResource<TMethods, ResourceProps<TData>>;
|
|
117
120
|
};
|
|
118
121
|
}
|
package/src/tapClientLookup.ts
CHANGED
|
@@ -1,34 +1,37 @@
|
|
|
1
1
|
import {
|
|
2
|
-
tapInlineResource,
|
|
3
2
|
tapMemo,
|
|
3
|
+
tapResource,
|
|
4
4
|
tapResources,
|
|
5
5
|
type ResourceElement,
|
|
6
6
|
} from "@assistant-ui/tap";
|
|
7
|
-
import type { ClientMethods
|
|
7
|
+
import type { ClientMethods } from "./types/client";
|
|
8
8
|
import { ClientResource } from "./tapClientResource";
|
|
9
9
|
import { wrapperResource } from "./wrapperResource";
|
|
10
10
|
|
|
11
|
+
type InferClientState<TMethods> = TMethods extends {
|
|
12
|
+
getState: () => infer S;
|
|
13
|
+
}
|
|
14
|
+
? S
|
|
15
|
+
: unknown;
|
|
16
|
+
|
|
11
17
|
const ClientResourceWithKey = wrapperResource(
|
|
12
|
-
<
|
|
13
|
-
el: ResourceElement<ClientOutputOf<TState, TMethods>>,
|
|
14
|
-
) => {
|
|
18
|
+
<TMethods extends ClientMethods>(el: ResourceElement<TMethods>) => {
|
|
15
19
|
if (el.key === undefined) {
|
|
16
20
|
throw new Error("tapClientResource: Element has no key");
|
|
17
21
|
}
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
TMethods
|
|
21
|
-
|
|
22
|
+
return tapResource(ClientResource(el)) as {
|
|
23
|
+
methods: TMethods;
|
|
24
|
+
state: InferClientState<TMethods>;
|
|
25
|
+
key: string | number;
|
|
26
|
+
};
|
|
22
27
|
},
|
|
23
28
|
);
|
|
24
29
|
|
|
25
|
-
export function tapClientLookup<
|
|
26
|
-
getElements: () => readonly ResourceElement<
|
|
27
|
-
ClientOutputOf<TState, TMethods>
|
|
28
|
-
>[],
|
|
30
|
+
export function tapClientLookup<TMethods extends ClientMethods>(
|
|
31
|
+
getElements: () => readonly ResourceElement<TMethods>[],
|
|
29
32
|
getElementsDeps: readonly unknown[],
|
|
30
33
|
): {
|
|
31
|
-
state:
|
|
34
|
+
state: InferClientState<TMethods>[];
|
|
32
35
|
get: (lookup: { index: number } | { key: string }) => TMethods;
|
|
33
36
|
} {
|
|
34
37
|
const resources = tapResources(
|