@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.
Files changed (112) hide show
  1. package/README.md +9 -10
  2. package/dist/AuiIf.d.ts +1 -1
  3. package/dist/AuiIf.d.ts.map +1 -1
  4. package/dist/AuiIf.js.map +1 -1
  5. package/dist/index.d.ts +3 -9
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +4 -10
  8. package/dist/index.js.map +1 -1
  9. package/dist/scope-registry-forward.d.ts +6 -0
  10. package/dist/scope-registry-forward.d.ts.map +1 -0
  11. package/dist/scope-registry-forward.js +2 -0
  12. package/dist/scope-registry-forward.js.map +1 -0
  13. package/dist/scope-registry.d.ts +17 -0
  14. package/dist/scope-registry.d.ts.map +1 -0
  15. package/dist/scope-registry.js +2 -0
  16. package/dist/scope-registry.js.map +1 -0
  17. package/dist/useAui.d.ts +3 -5
  18. package/dist/useAui.d.ts.map +1 -1
  19. package/dist/useAui.js +6 -11
  20. package/dist/useAui.js.map +1 -1
  21. package/dist/useAuiEvent.d.ts +1 -1
  22. package/dist/useAuiEvent.d.ts.map +1 -1
  23. package/dist/useAuiEvent.js +1 -1
  24. package/dist/useAuiEvent.js.map +1 -1
  25. package/dist/useAuiState.d.ts +1 -1
  26. package/dist/useAuiState.d.ts.map +1 -1
  27. package/dist/useAuiState.js +1 -1
  28. package/dist/useAuiState.js.map +1 -1
  29. package/dist/utils/react-assistant-context.d.ts +1 -1
  30. package/dist/utils/react-assistant-context.d.ts.map +1 -1
  31. package/dist/utils/react-assistant-context.js +1 -2
  32. package/dist/utils/react-assistant-context.js.map +1 -1
  33. package/package.json +10 -3
  34. package/src/{AuiIf.tsx → AuiIf.ts} +1 -1
  35. package/src/__tests__/hooks.test.tsx +126 -0
  36. package/src/index.ts +25 -32
  37. package/src/scope-registry-forward.ts +6 -0
  38. package/src/scope-registry.ts +15 -0
  39. package/src/{useAui.tsx → useAui.ts} +24 -27
  40. package/src/useAuiEvent.ts +2 -2
  41. package/src/{useAuiState.tsx → useAuiState.ts} +3 -3
  42. package/src/utils/react-assistant-context.tsx +7 -3
  43. package/dist/Derived.d.ts +0 -34
  44. package/dist/Derived.d.ts.map +0 -1
  45. package/dist/Derived.js +0 -24
  46. package/dist/Derived.js.map +0 -1
  47. package/dist/attachDefaultPeers.d.ts +0 -56
  48. package/dist/attachDefaultPeers.d.ts.map +0 -1
  49. package/dist/attachDefaultPeers.js +0 -51
  50. package/dist/attachDefaultPeers.js.map +0 -1
  51. package/dist/tapClientList.d.ts +0 -24
  52. package/dist/tapClientList.d.ts.map +0 -1
  53. package/dist/tapClientList.js +0 -68
  54. package/dist/tapClientList.js.map +0 -1
  55. package/dist/tapClientLookup.d.ts +0 -11
  56. package/dist/tapClientLookup.d.ts.map +0 -1
  57. package/dist/tapClientLookup.js +0 -42
  58. package/dist/tapClientLookup.js.map +0 -1
  59. package/dist/tapClientResource.d.ts +0 -28
  60. package/dist/tapClientResource.d.ts.map +0 -1
  61. package/dist/tapClientResource.js +0 -122
  62. package/dist/tapClientResource.js.map +0 -1
  63. package/dist/types/client.d.ts +0 -119
  64. package/dist/types/client.d.ts.map +0 -1
  65. package/dist/types/client.js +0 -2
  66. package/dist/types/client.js.map +0 -1
  67. package/dist/types/events.d.ts +0 -33
  68. package/dist/types/events.d.ts.map +0 -1
  69. package/dist/types/events.js +0 -8
  70. package/dist/types/events.js.map +0 -1
  71. package/dist/utils/BaseProxyHandler.d.ts +0 -23
  72. package/dist/utils/BaseProxyHandler.d.ts.map +0 -1
  73. package/dist/utils/BaseProxyHandler.js +0 -46
  74. package/dist/utils/BaseProxyHandler.js.map +0 -1
  75. package/dist/utils/NotificationManager.d.ts +0 -11
  76. package/dist/utils/NotificationManager.d.ts.map +0 -1
  77. package/dist/utils/NotificationManager.js +0 -84
  78. package/dist/utils/NotificationManager.js.map +0 -1
  79. package/dist/utils/proxied-assistant-state.d.ts +0 -8
  80. package/dist/utils/proxied-assistant-state.d.ts.map +0 -1
  81. package/dist/utils/proxied-assistant-state.js +0 -34
  82. package/dist/utils/proxied-assistant-state.js.map +0 -1
  83. package/dist/utils/splitClients.d.ts +0 -10
  84. package/dist/utils/splitClients.d.ts.map +0 -1
  85. package/dist/utils/splitClients.js +0 -83
  86. package/dist/utils/splitClients.js.map +0 -1
  87. package/dist/utils/tap-assistant-context.d.ts +0 -19
  88. package/dist/utils/tap-assistant-context.d.ts.map +0 -1
  89. package/dist/utils/tap-assistant-context.js +0 -23
  90. package/dist/utils/tap-assistant-context.js.map +0 -1
  91. package/dist/utils/tap-client-stack-context.d.ts +0 -23
  92. package/dist/utils/tap-client-stack-context.d.ts.map +0 -1
  93. package/dist/utils/tap-client-stack-context.js +0 -28
  94. package/dist/utils/tap-client-stack-context.js.map +0 -1
  95. package/dist/wrapperResource.d.ts +0 -3
  96. package/dist/wrapperResource.d.ts.map +0 -1
  97. package/dist/wrapperResource.js +0 -11
  98. package/dist/wrapperResource.js.map +0 -1
  99. package/src/Derived.ts +0 -46
  100. package/src/attachDefaultPeers.ts +0 -78
  101. package/src/tapClientList.ts +0 -118
  102. package/src/tapClientLookup.ts +0 -76
  103. package/src/tapClientResource.ts +0 -182
  104. package/src/types/client.ts +0 -186
  105. package/src/types/events.ts +0 -77
  106. package/src/utils/BaseProxyHandler.ts +0 -50
  107. package/src/utils/NotificationManager.ts +0 -114
  108. package/src/utils/proxied-assistant-state.tsx +0 -53
  109. package/src/utils/splitClients.ts +0 -130
  110. package/src/utils/tap-assistant-context.ts +0 -58
  111. package/src/utils/tap-client-stack-context.ts +0 -51
  112. 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
- };
@@ -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
- };