@assistant-ui/store 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -10
- package/dist/AuiIf.d.ts +1 -1
- package/dist/AuiIf.d.ts.map +1 -1
- package/dist/AuiIf.js.map +1 -1
- package/dist/index.d.ts +3 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -10
- package/dist/index.js.map +1 -1
- package/dist/scope-registry-forward.d.ts +6 -0
- package/dist/scope-registry-forward.d.ts.map +1 -0
- package/dist/scope-registry-forward.js +2 -0
- package/dist/scope-registry-forward.js.map +1 -0
- package/dist/scope-registry.d.ts +17 -0
- package/dist/scope-registry.d.ts.map +1 -0
- package/dist/scope-registry.js +2 -0
- package/dist/scope-registry.js.map +1 -0
- package/dist/useAui.d.ts +3 -5
- package/dist/useAui.d.ts.map +1 -1
- package/dist/useAui.js +6 -11
- package/dist/useAui.js.map +1 -1
- package/dist/useAuiEvent.d.ts +1 -1
- package/dist/useAuiEvent.d.ts.map +1 -1
- package/dist/useAuiEvent.js +1 -1
- package/dist/useAuiEvent.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/react-assistant-context.d.ts +1 -1
- package/dist/utils/react-assistant-context.d.ts.map +1 -1
- package/dist/utils/react-assistant-context.js +1 -2
- package/dist/utils/react-assistant-context.js.map +1 -1
- package/package.json +10 -3
- package/src/{AuiIf.tsx → AuiIf.ts} +1 -1
- package/src/__tests__/hooks.test.tsx +126 -0
- package/src/index.ts +25 -32
- package/src/scope-registry-forward.ts +6 -0
- package/src/scope-registry.ts +15 -0
- package/src/{useAui.tsx → useAui.ts} +24 -27
- package/src/useAuiEvent.ts +2 -2
- package/src/{useAuiState.tsx → useAuiState.ts} +3 -3
- package/src/utils/react-assistant-context.tsx +7 -3
- package/dist/Derived.d.ts +0 -34
- package/dist/Derived.d.ts.map +0 -1
- package/dist/Derived.js +0 -24
- package/dist/Derived.js.map +0 -1
- 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/dist/tapClientList.d.ts +0 -24
- package/dist/tapClientList.d.ts.map +0 -1
- package/dist/tapClientList.js +0 -68
- package/dist/tapClientList.js.map +0 -1
- package/dist/tapClientLookup.d.ts +0 -11
- package/dist/tapClientLookup.d.ts.map +0 -1
- package/dist/tapClientLookup.js +0 -42
- package/dist/tapClientLookup.js.map +0 -1
- package/dist/tapClientResource.d.ts +0 -28
- package/dist/tapClientResource.d.ts.map +0 -1
- package/dist/tapClientResource.js +0 -122
- package/dist/tapClientResource.js.map +0 -1
- package/dist/types/client.d.ts +0 -119
- package/dist/types/client.d.ts.map +0 -1
- package/dist/types/client.js +0 -2
- package/dist/types/client.js.map +0 -1
- package/dist/types/events.d.ts +0 -33
- package/dist/types/events.d.ts.map +0 -1
- package/dist/types/events.js +0 -8
- package/dist/types/events.js.map +0 -1
- package/dist/utils/BaseProxyHandler.d.ts +0 -23
- package/dist/utils/BaseProxyHandler.d.ts.map +0 -1
- package/dist/utils/BaseProxyHandler.js +0 -46
- package/dist/utils/BaseProxyHandler.js.map +0 -1
- package/dist/utils/NotificationManager.d.ts +0 -11
- package/dist/utils/NotificationManager.d.ts.map +0 -1
- package/dist/utils/NotificationManager.js +0 -84
- package/dist/utils/NotificationManager.js.map +0 -1
- package/dist/utils/proxied-assistant-state.d.ts +0 -8
- package/dist/utils/proxied-assistant-state.d.ts.map +0 -1
- package/dist/utils/proxied-assistant-state.js +0 -34
- package/dist/utils/proxied-assistant-state.js.map +0 -1
- package/dist/utils/splitClients.d.ts +0 -10
- package/dist/utils/splitClients.d.ts.map +0 -1
- package/dist/utils/splitClients.js +0 -83
- package/dist/utils/splitClients.js.map +0 -1
- package/dist/utils/tap-assistant-context.d.ts +0 -19
- package/dist/utils/tap-assistant-context.d.ts.map +0 -1
- package/dist/utils/tap-assistant-context.js +0 -23
- package/dist/utils/tap-assistant-context.js.map +0 -1
- package/dist/utils/tap-client-stack-context.d.ts +0 -23
- package/dist/utils/tap-client-stack-context.d.ts.map +0 -1
- package/dist/utils/tap-client-stack-context.js +0 -28
- package/dist/utils/tap-client-stack-context.js.map +0 -1
- package/dist/wrapperResource.d.ts +0 -3
- package/dist/wrapperResource.d.ts.map +0 -1
- package/dist/wrapperResource.js +0 -11
- package/dist/wrapperResource.js.map +0 -1
- package/src/Derived.ts +0 -46
- package/src/attachDefaultPeers.ts +0 -78
- package/src/tapClientList.ts +0 -118
- package/src/tapClientLookup.ts +0 -76
- package/src/tapClientResource.ts +0 -182
- package/src/types/client.ts +0 -186
- package/src/types/events.ts +0 -77
- package/src/utils/BaseProxyHandler.ts +0 -50
- package/src/utils/NotificationManager.ts +0 -114
- package/src/utils/proxied-assistant-state.tsx +0 -53
- package/src/utils/splitClients.ts +0 -130
- package/src/utils/tap-assistant-context.ts +0 -58
- package/src/utils/tap-client-stack-context.ts +0 -51
- package/src/wrapperResource.ts +0 -17
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { Derived, DerivedElement } from "../Derived";
|
|
2
|
-
import type {
|
|
3
|
-
AssistantClient,
|
|
4
|
-
ClientElement,
|
|
5
|
-
ClientNames,
|
|
6
|
-
} from "../types/client";
|
|
7
|
-
import { getDefaultPeers } from "../attachDefaultPeers";
|
|
8
|
-
import type { useAui } from "../useAui";
|
|
9
|
-
import { tapMemo } from "@assistant-ui/tap";
|
|
10
|
-
|
|
11
|
-
export type RootClients = Partial<
|
|
12
|
-
Record<ClientNames, ClientElement<ClientNames>>
|
|
13
|
-
>;
|
|
14
|
-
export type DerivedClients = Partial<
|
|
15
|
-
Record<ClientNames, DerivedElement<ClientNames>>
|
|
16
|
-
>;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Splits a clients object into root clients and derived clients.
|
|
20
|
-
*
|
|
21
|
-
* @param clients - The clients input object to split
|
|
22
|
-
* @returns An object with { rootClients, derivedClients }
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const clients = {
|
|
27
|
-
* foo: RootClient({ ... }),
|
|
28
|
-
* bar: Derived({ ... }),
|
|
29
|
-
* };
|
|
30
|
-
*
|
|
31
|
-
* const { rootClients, derivedClients } = splitClients(clients);
|
|
32
|
-
* // rootClients = { foo: ... }
|
|
33
|
-
* // derivedClients = { bar: ... }
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
function splitClients(clients: useAui.Props, baseClient: AssistantClient) {
|
|
37
|
-
const rootClients: RootClients = {};
|
|
38
|
-
const derivedClients: DerivedClients = {};
|
|
39
|
-
|
|
40
|
-
for (const [key, clientElement] of Object.entries(clients) as [
|
|
41
|
-
keyof useAui.Props,
|
|
42
|
-
NonNullable<useAui.Props[keyof useAui.Props]>,
|
|
43
|
-
][]) {
|
|
44
|
-
if (clientElement.type === Derived) {
|
|
45
|
-
derivedClients[key] = clientElement as DerivedElement<ClientNames>;
|
|
46
|
-
} else {
|
|
47
|
-
rootClients[key] = clientElement as ClientElement<ClientNames>;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Recursively gather all default peers, flattening nested ones
|
|
52
|
-
const gatherDefaultPeers = (
|
|
53
|
-
clientElement: ClientElement<ClientNames>,
|
|
54
|
-
visited = new Set<ClientElement<ClientNames>>(),
|
|
55
|
-
): Array<
|
|
56
|
-
[ClientNames, ClientElement<ClientNames> | DerivedElement<ClientNames>]
|
|
57
|
-
> => {
|
|
58
|
-
// Prevent infinite loops
|
|
59
|
-
if (visited.has(clientElement)) return [];
|
|
60
|
-
visited.add(clientElement);
|
|
61
|
-
|
|
62
|
-
const defaultPeers = getDefaultPeers(clientElement.type);
|
|
63
|
-
if (!defaultPeers) return [];
|
|
64
|
-
|
|
65
|
-
const result: Array<
|
|
66
|
-
[ClientNames, ClientElement<ClientNames> | DerivedElement<ClientNames>]
|
|
67
|
-
> = [];
|
|
68
|
-
|
|
69
|
-
for (const [key, peerElement] of Object.entries(defaultPeers) as [
|
|
70
|
-
ClientNames,
|
|
71
|
-
ClientElement<ClientNames> | DerivedElement<ClientNames>,
|
|
72
|
-
][]) {
|
|
73
|
-
result.push([key, peerElement]);
|
|
74
|
-
|
|
75
|
-
// If this peer is a root client with its own default peers, recursively gather them
|
|
76
|
-
if (peerElement.type !== Derived<ClientNames>) {
|
|
77
|
-
const nestedPeers = gatherDefaultPeers(
|
|
78
|
-
peerElement as ClientElement<ClientNames>,
|
|
79
|
-
visited,
|
|
80
|
-
);
|
|
81
|
-
result.push(...nestedPeers);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return result;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
// Apply flattened default peers for each root client
|
|
89
|
-
for (const [_clientKey, clientElement] of Object.entries(rootClients) as [
|
|
90
|
-
ClientNames,
|
|
91
|
-
ClientElement<ClientNames>,
|
|
92
|
-
][]) {
|
|
93
|
-
const allPeers = gatherDefaultPeers(clientElement);
|
|
94
|
-
|
|
95
|
-
for (const [key, peerElement] of allPeers) {
|
|
96
|
-
// Skip if already exists (first wins)
|
|
97
|
-
if (
|
|
98
|
-
key in rootClients ||
|
|
99
|
-
key in derivedClients ||
|
|
100
|
-
baseClient[key].source !== null
|
|
101
|
-
)
|
|
102
|
-
continue;
|
|
103
|
-
|
|
104
|
-
if (peerElement.type === Derived<ClientNames>) {
|
|
105
|
-
derivedClients[key] = peerElement as DerivedElement<ClientNames>;
|
|
106
|
-
} else {
|
|
107
|
-
rootClients[key] = peerElement as ClientElement<ClientNames>;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return { rootClients, derivedClients };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const tapShallowMemoObject = <T extends object>(object: T) => {
|
|
116
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: shallow memo
|
|
117
|
-
return tapMemo(() => object, [...Object.entries(object).flat()]);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
export const tapSplitClients = (
|
|
121
|
-
clients: useAui.Props,
|
|
122
|
-
baseClient: AssistantClient,
|
|
123
|
-
) => {
|
|
124
|
-
const { rootClients, derivedClients } = splitClients(clients, baseClient);
|
|
125
|
-
|
|
126
|
-
return {
|
|
127
|
-
rootClients: tapShallowMemoObject(rootClients),
|
|
128
|
-
derivedClients: tapShallowMemoObject(derivedClients),
|
|
129
|
-
};
|
|
130
|
-
};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createResourceContext,
|
|
3
|
-
tap,
|
|
4
|
-
withContextProvider,
|
|
5
|
-
tapEffectEvent,
|
|
6
|
-
} from "@assistant-ui/tap";
|
|
7
|
-
import type {
|
|
8
|
-
AssistantEventName,
|
|
9
|
-
AssistantEventPayload,
|
|
10
|
-
} from "../types/events";
|
|
11
|
-
import type { AssistantClient } from "../types/client";
|
|
12
|
-
import { tapClientStack, type ClientStack } from "./tap-client-stack-context";
|
|
13
|
-
|
|
14
|
-
type EmitFn = <TEvent extends Exclude<AssistantEventName, "*">>(
|
|
15
|
-
event: TEvent,
|
|
16
|
-
payload: AssistantEventPayload[TEvent],
|
|
17
|
-
clientStack: ClientStack,
|
|
18
|
-
) => void;
|
|
19
|
-
|
|
20
|
-
export type AssistantTapContextValue = {
|
|
21
|
-
clientRef: { parent: AssistantClient; current: AssistantClient | null };
|
|
22
|
-
emit: EmitFn;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const AssistantTapContext =
|
|
26
|
-
createResourceContext<AssistantTapContextValue | null>(null);
|
|
27
|
-
|
|
28
|
-
export const withAssistantTapContextProvider = <TResult>(
|
|
29
|
-
value: AssistantTapContextValue,
|
|
30
|
-
fn: () => TResult,
|
|
31
|
-
) => {
|
|
32
|
-
return withContextProvider(AssistantTapContext, value, fn);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const tapAssistantTapContext = () => {
|
|
36
|
-
const ctx = tap(AssistantTapContext);
|
|
37
|
-
if (!ctx) throw new Error("AssistantTapContext is not available");
|
|
38
|
-
|
|
39
|
-
return ctx;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export const tapAssistantClientRef = () => {
|
|
43
|
-
return tapAssistantTapContext().clientRef;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export const tapAssistantEmit = () => {
|
|
47
|
-
const { emit } = tapAssistantTapContext();
|
|
48
|
-
const clientStack = tapClientStack();
|
|
49
|
-
|
|
50
|
-
return tapEffectEvent(
|
|
51
|
-
<TEvent extends Exclude<AssistantEventName, "*">>(
|
|
52
|
-
event: TEvent,
|
|
53
|
-
payload: AssistantEventPayload[TEvent],
|
|
54
|
-
) => {
|
|
55
|
-
emit(event, payload, clientStack);
|
|
56
|
-
},
|
|
57
|
-
);
|
|
58
|
-
};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createResourceContext,
|
|
3
|
-
tap,
|
|
4
|
-
withContextProvider,
|
|
5
|
-
tapMemo,
|
|
6
|
-
} from "@assistant-ui/tap";
|
|
7
|
-
import type { ClientMethods } from "../types/client";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Symbol used to get the client index from a ClientProxy.
|
|
11
|
-
*/
|
|
12
|
-
export const SYMBOL_CLIENT_INDEX = Symbol("assistant-ui.store.clientIndex");
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Get the index of a client (its position in the client stack when created).
|
|
16
|
-
*/
|
|
17
|
-
export const getClientIndex = (client: ClientMethods): number => {
|
|
18
|
-
return (client as unknown as { [SYMBOL_CLIENT_INDEX]: number })[
|
|
19
|
-
SYMBOL_CLIENT_INDEX
|
|
20
|
-
];
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The client stack - an array of clients representing the current hierarchy.
|
|
25
|
-
*/
|
|
26
|
-
export type ClientStack = readonly ClientMethods[];
|
|
27
|
-
|
|
28
|
-
const ClientStackContext = createResourceContext<ClientStack>([]);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Get the current client stack inside a tap resource.
|
|
32
|
-
*/
|
|
33
|
-
export const tapClientStack = (): ClientStack => {
|
|
34
|
-
return tap(ClientStackContext);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Execute a callback with a client pushed onto the stack.
|
|
39
|
-
* The stack is duplicated, not mutated.
|
|
40
|
-
*/
|
|
41
|
-
export const tapWithClientStack = <T>(
|
|
42
|
-
client: ClientMethods,
|
|
43
|
-
callback: () => T,
|
|
44
|
-
): T => {
|
|
45
|
-
const currentStack = tapClientStack();
|
|
46
|
-
const newStack = tapMemo(
|
|
47
|
-
() => [...currentStack, client],
|
|
48
|
-
[currentStack, client],
|
|
49
|
-
);
|
|
50
|
-
return withContextProvider(ClientStackContext, newStack, callback);
|
|
51
|
-
};
|
package/src/wrapperResource.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ResourceElement,
|
|
3
|
-
Resource,
|
|
4
|
-
resource,
|
|
5
|
-
withKey,
|
|
6
|
-
} from "@assistant-ui/tap";
|
|
7
|
-
|
|
8
|
-
export const wrapperResource = <R, P>(
|
|
9
|
-
fn: (props: ResourceElement<P>) => R,
|
|
10
|
-
): Resource<R, ResourceElement<P>> => {
|
|
11
|
-
const res = resource(fn);
|
|
12
|
-
return (props: ResourceElement<P>) => {
|
|
13
|
-
const el = res(props);
|
|
14
|
-
if (props.key === undefined) return el;
|
|
15
|
-
return withKey(props.key, el);
|
|
16
|
-
};
|
|
17
|
-
};
|