@assistant-ui/store 0.2.11 → 0.2.13

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 (94) hide show
  1. package/dist/AuiIf.d.ts +19 -15
  2. package/dist/AuiIf.d.ts.map +1 -1
  3. package/dist/AuiIf.js +27 -24
  4. package/dist/AuiIf.js.map +1 -1
  5. package/dist/Derived.d.ts +15 -11
  6. package/dist/Derived.d.ts.map +1 -1
  7. package/dist/Derived.js +24 -20
  8. package/dist/Derived.js.map +1 -1
  9. package/dist/RenderChildrenWithAccessor.d.ts +13 -6
  10. package/dist/RenderChildrenWithAccessor.d.ts.map +1 -1
  11. package/dist/RenderChildrenWithAccessor.js +42 -48
  12. package/dist/RenderChildrenWithAccessor.js.map +1 -1
  13. package/dist/attachTransformScopes.d.ts +11 -10
  14. package/dist/attachTransformScopes.d.ts.map +1 -1
  15. package/dist/attachTransformScopes.js +20 -23
  16. package/dist/attachTransformScopes.js.map +1 -1
  17. package/dist/index.d.ts +15 -16
  18. package/dist/index.js +14 -18
  19. package/dist/tapClientList.d.ts +26 -23
  20. package/dist/tapClientList.d.ts.map +1 -1
  21. package/dist/tapClientList.js +66 -63
  22. package/dist/tapClientList.js.map +1 -1
  23. package/dist/tapClientLookup.d.ts +14 -11
  24. package/dist/tapClientLookup.d.ts.map +1 -1
  25. package/dist/tapClientLookup.js +31 -37
  26. package/dist/tapClientLookup.js.map +1 -1
  27. package/dist/tapClientResource.d.ts +12 -9
  28. package/dist/tapClientResource.d.ts.map +1 -1
  29. package/dist/tapClientResource.js +92 -104
  30. package/dist/tapClientResource.js.map +1 -1
  31. package/dist/types/client.d.ts +50 -42
  32. package/dist/types/client.d.ts.map +1 -1
  33. package/dist/types/client.js +0 -2
  34. package/dist/types/events.d.ts +23 -24
  35. package/dist/types/events.d.ts.map +1 -1
  36. package/dist/types/events.js +13 -6
  37. package/dist/types/events.js.map +1 -1
  38. package/dist/useAui.d.ts +17 -15
  39. package/dist/useAui.d.ts.map +1 -1
  40. package/dist/useAui.js +176 -191
  41. package/dist/useAui.js.map +1 -1
  42. package/dist/useAuiEvent.d.ts +6 -2
  43. package/dist/useAuiEvent.d.ts.map +1 -1
  44. package/dist/useAuiEvent.js +58 -47
  45. package/dist/useAuiEvent.js.map +1 -1
  46. package/dist/useAuiState.d.ts +6 -2
  47. package/dist/useAuiState.d.ts.map +1 -1
  48. package/dist/useAuiState.js +44 -42
  49. package/dist/useAuiState.js.map +1 -1
  50. package/dist/utils/BaseProxyHandler.d.ts +19 -16
  51. package/dist/utils/BaseProxyHandler.d.ts.map +1 -1
  52. package/dist/utils/BaseProxyHandler.js +46 -43
  53. package/dist/utils/BaseProxyHandler.js.map +1 -1
  54. package/dist/utils/NotificationManager.d.ts +13 -9
  55. package/dist/utils/NotificationManager.d.ts.map +1 -1
  56. package/dist/utils/NotificationManager.js +69 -82
  57. package/dist/utils/NotificationManager.js.map +1 -1
  58. package/dist/utils/proxied-assistant-state.d.ts +8 -4
  59. package/dist/utils/proxied-assistant-state.d.ts.map +1 -1
  60. package/dist/utils/proxied-assistant-state.js +28 -26
  61. package/dist/utils/proxied-assistant-state.js.map +1 -1
  62. package/dist/utils/react-assistant-context.d.ts +15 -10
  63. package/dist/utils/react-assistant-context.d.ts.map +1 -1
  64. package/dist/utils/react-assistant-context.js +69 -67
  65. package/dist/utils/react-assistant-context.js.map +1 -1
  66. package/dist/utils/splitClients.d.ts +12 -8
  67. package/dist/utils/splitClients.d.ts.map +1 -1
  68. package/dist/utils/splitClients.js +39 -43
  69. package/dist/utils/splitClients.js.map +1 -1
  70. package/dist/utils/tap-assistant-context.d.ts +17 -14
  71. package/dist/utils/tap-assistant-context.d.ts.map +1 -1
  72. package/dist/utils/tap-assistant-context.js +18 -15
  73. package/dist/utils/tap-assistant-context.js.map +1 -1
  74. package/dist/utils/tap-client-stack-context.d.ts +10 -6
  75. package/dist/utils/tap-client-stack-context.d.ts.map +1 -1
  76. package/dist/utils/tap-client-stack-context.js +22 -19
  77. package/dist/utils/tap-client-stack-context.js.map +1 -1
  78. package/dist/wrapperResource.d.ts +6 -2
  79. package/dist/wrapperResource.d.ts.map +1 -1
  80. package/dist/wrapperResource.js +12 -9
  81. package/dist/wrapperResource.js.map +1 -1
  82. package/package.json +7 -7
  83. package/src/RenderChildrenWithAccessor.tsx +1 -1
  84. package/src/__tests__/RenderChildrenWithAccessor.test.tsx +0 -1
  85. package/src/__tests__/hooks.test.tsx +0 -1
  86. package/src/tapClientLookup.ts +1 -1
  87. package/src/types/client.ts +1 -3
  88. package/src/types/events.ts +1 -3
  89. package/src/useAui.ts +1 -2
  90. package/src/useAuiEvent.ts +1 -4
  91. package/src/utils/splitClients.ts +1 -1
  92. package/dist/index.d.ts.map +0 -1
  93. package/dist/index.js.map +0 -1
  94. package/dist/types/client.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientList.d.ts","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAEpD,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,OAAO,CAAC;AAuBZ,eAAO,MAAM,aAAa,GAAI,KAAK,EAAE,QAAQ,SAAS,aAAa,EACjE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,KAC1C;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;IAC/D,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC;CAqEnC,CAAC;AAEF,yBAAiB,aAAa,CAAC;IAC7B,KAAY,aAAa,CAAC,KAAK,IAAI;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IAEF,KAAY,KAAK,CAAC,KAAK,EAAE,QAAQ,SAAS,aAAa,IAAI;QACzD,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;QAChC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;KACjE,CAAC;CACH"}
1
+ {"version":3,"file":"tapClientList.d.ts","names":[],"sources":["../src/tapClientList.ts"],"mappings":";;;;KAKK,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,cAwBS,aAAA,2BAAyC,aAAA,EACpD,KAAA,EAAO,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,QAAA;EAElC,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,GAAA,GAAM,MAAA;IAAU,KAAA;EAAA;IAAoB,GAAA;EAAA,MAAkB,QAAA;EACtD,GAAA,GAAM,WAAA,EAAa,KAAA;AAAA;AAAA,kBAuEJ,aAAA;EAAA,KACH,aAAA;IACV,GAAA;IACA,cAAA,QAAsB,KAAA;IACtB,MAAA;EAAA;EAAA,KAGU,KAAA,yBAA8B,aAAA;IACxC,aAAA,EAAe,KAAA;IACf,MAAA,GAAS,IAAA,EAAM,KAAA;IACf,QAAA,EAAU,qBAAA,CAAsB,QAAA,EAAU,aAAA,CAAc,KAAA;EAAA;AAAA"}
@@ -1,68 +1,71 @@
1
- import { tapConst, tapState, withKey } from "@assistant-ui/tap";
2
1
  import { tapClientLookup } from "./tapClientLookup.js";
2
+ import { tapConst, tapState, withKey } from "@assistant-ui/tap";
3
+ //#region src/tapClientList.ts
3
4
  const createProps = (key, data, remove) => {
4
- return {
5
- key,
6
- getInitialData: () => {
7
- if (!data.hasData) {
8
- throw new Error("getInitialData may only be called during initial render");
9
- }
10
- return data.data;
11
- },
12
- remove,
13
- };
5
+ return {
6
+ key,
7
+ getInitialData: () => {
8
+ if (!data.hasData) throw new Error("getInitialData may only be called during initial render");
9
+ return data.data;
10
+ },
11
+ remove
12
+ };
14
13
  };
15
- export const tapClientList = (props) => {
16
- const { initialValues, getKey, resource: Resource } = props;
17
- const initialDataHandles = tapConst(() => [], []);
18
- const [items, setItems] = tapState(() => {
19
- const entries = [];
20
- for (const data of initialValues) {
21
- const key = getKey(data);
22
- const handle = { data, hasData: true };
23
- entries.push([
24
- key,
25
- createProps(key, handle, () => {
26
- setItems((items) => {
27
- const newItems = { ...items };
28
- delete newItems[key];
29
- return newItems;
30
- });
31
- }),
32
- ]);
33
- initialDataHandles.push(handle);
34
- }
35
- return Object.fromEntries(entries);
36
- });
37
- const lookup = tapClientLookup(() => Object.values(items).map((props) => withKey(props.key, Resource(props))), [items, Resource]);
38
- initialDataHandles.forEach((handle) => {
39
- handle.data = undefined;
40
- handle.hasData = false;
41
- });
42
- const add = (data) => {
43
- const key = getKey(data);
44
- setItems((items) => {
45
- if (key in items) {
46
- throw new Error(`Tried to add item with a key ${key} that already exists`);
47
- }
48
- const handle = { data, hasData: true };
49
- initialDataHandles.push(handle);
50
- return {
51
- ...items,
52
- [key]: createProps(key, handle, () => {
53
- setItems((items) => {
54
- const newItems = { ...items };
55
- delete newItems[key];
56
- return newItems;
57
- });
58
- }),
59
- };
60
- });
61
- };
62
- return {
63
- state: lookup.state,
64
- get: lookup.get,
65
- add,
66
- };
14
+ const tapClientList = (props) => {
15
+ const { initialValues, getKey, resource: Resource } = props;
16
+ const initialDataHandles = tapConst(() => [], []);
17
+ const [items, setItems] = tapState(() => {
18
+ const entries = [];
19
+ for (const data of initialValues) {
20
+ const key = getKey(data);
21
+ const handle = {
22
+ data,
23
+ hasData: true
24
+ };
25
+ entries.push([key, createProps(key, handle, () => {
26
+ setItems((items) => {
27
+ const newItems = { ...items };
28
+ delete newItems[key];
29
+ return newItems;
30
+ });
31
+ })]);
32
+ initialDataHandles.push(handle);
33
+ }
34
+ return Object.fromEntries(entries);
35
+ });
36
+ const lookup = tapClientLookup(() => Object.values(items).map((props) => withKey(props.key, Resource(props))), [items, Resource]);
37
+ initialDataHandles.forEach((handle) => {
38
+ handle.data = void 0;
39
+ handle.hasData = false;
40
+ });
41
+ const add = (data) => {
42
+ const key = getKey(data);
43
+ setItems((items) => {
44
+ if (key in items) throw new Error(`Tried to add item with a key ${key} that already exists`);
45
+ const handle = {
46
+ data,
47
+ hasData: true
48
+ };
49
+ initialDataHandles.push(handle);
50
+ return {
51
+ ...items,
52
+ [key]: createProps(key, handle, () => {
53
+ setItems((items) => {
54
+ const newItems = { ...items };
55
+ delete newItems[key];
56
+ return newItems;
57
+ });
58
+ })
59
+ };
60
+ });
61
+ };
62
+ return {
63
+ state: lookup.state,
64
+ get: lookup.get,
65
+ add
66
+ };
67
67
  };
68
+ //#endregion
69
+ export { tapClientList };
70
+
68
71
  //# sourceMappingURL=tapClientList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientList.js","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tapClientList.js","names":[],"sources":["../src/tapClientList.ts"],"sourcesContent":["import { tapConst, tapState, withKey } from \"@assistant-ui/tap\";\nimport type { ContravariantResource } from \"@assistant-ui/tap\";\nimport { tapClientLookup } from \"./tapClientLookup\";\nimport type { ClientMethods } from \"./types/client\";\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : unknown;\n\ntype DataHandle<TData> = { data: TData | undefined; hasData: boolean };\n\nconst createProps = <TData>(\n key: string,\n data: DataHandle<TData>,\n remove: () => void,\n): tapClientList.ResourceProps<TData> => {\n return {\n key,\n getInitialData: () => {\n if (!data.hasData) {\n throw new Error(\n \"getInitialData may only be called during initial render\",\n );\n }\n return data.data!;\n },\n remove,\n };\n};\n\nexport const tapClientList = <TData, TMethods extends ClientMethods>(\n props: tapClientList.Props<TData, TMethods>,\n): {\n state: InferClientState<TMethods>[];\n get: (lookup: { index: number } | { key: string }) => TMethods;\n add: (initialData: TData) => void;\n} => {\n const { initialValues, getKey, resource: Resource } = props;\n\n type Props = tapClientList.ResourceProps<TData>;\n\n const initialDataHandles: DataHandle<TData>[] = tapConst(() => [], []);\n\n const [items, setItems] = tapState<Record<string, Props>>(() => {\n const entries: [string, Props][] = [];\n for (const data of initialValues) {\n const key = getKey(data);\n const handle = { data, hasData: true };\n entries.push([\n key,\n createProps(key, handle, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n ]);\n initialDataHandles.push(handle);\n }\n return Object.fromEntries(entries);\n });\n\n const lookup = tapClientLookup<TMethods>(\n () =>\n Object.values(items).map((props) => withKey(props.key, Resource(props))),\n [items, Resource],\n );\n\n initialDataHandles.forEach((handle) => {\n handle.data = undefined;\n handle.hasData = false;\n });\n\n const add = (data: TData) => {\n const key = getKey(data);\n setItems((items) => {\n if (key in items) {\n throw new Error(\n `Tried to add item with a key ${key} that already exists`,\n );\n }\n\n const handle = { data, hasData: true };\n initialDataHandles.push(handle);\n\n return {\n ...items,\n [key]: createProps(key, handle, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n };\n });\n };\n\n return {\n state: lookup.state,\n get: lookup.get,\n add,\n };\n};\n\nexport namespace tapClientList {\n export type ResourceProps<TData> = {\n key: string;\n getInitialData: () => TData;\n remove: () => void;\n };\n\n export type Props<TData, TMethods extends ClientMethods> = {\n initialValues: TData[];\n getKey: (data: TData) => string;\n resource: ContravariantResource<TMethods, ResourceProps<TData>>;\n };\n}\n"],"mappings":";;;AAaA,MAAM,eACJ,KACA,MACA,WACuC;CACvC,OAAO;EACL;EACA,sBAAsB;GACpB,IAAI,CAAC,KAAK,SACR,MAAM,IAAI,MACR,yDACF;GAEF,OAAO,KAAK;EACd;EACA;CACF;AACF;AAEA,MAAa,iBACX,UAKG;CACH,MAAM,EAAE,eAAe,QAAQ,UAAU,aAAa;CAItD,MAAM,qBAA0C,eAAe,CAAC,GAAG,CAAC,CAAC;CAErE,MAAM,CAAC,OAAO,YAAY,eAAsC;EAC9D,MAAM,UAA6B,CAAC;EACpC,KAAK,MAAM,QAAQ,eAAe;GAChC,MAAM,MAAM,OAAO,IAAI;GACvB,MAAM,SAAS;IAAE;IAAM,SAAS;GAAK;GACrC,QAAQ,KAAK,CACX,KACA,YAAY,KAAK,cAAc;IAC7B,UAAU,UAAU;KAClB,MAAM,WAAW,EAAE,GAAG,MAAM;KAC5B,OAAO,SAAS;KAChB,OAAO;IACT,CAAC;GACH,CAAC,CACH,CAAC;GACD,mBAAmB,KAAK,MAAM;EAChC;EACA,OAAO,OAAO,YAAY,OAAO;CACnC,CAAC;CAED,MAAM,SAAS,sBAEX,OAAO,OAAO,KAAK,EAAE,KAAK,UAAU,QAAQ,MAAM,KAAK,SAAS,KAAK,CAAC,CAAC,GACzE,CAAC,OAAO,QAAQ,CAClB;CAEA,mBAAmB,SAAS,WAAW;EACrC,OAAO,OAAO,KAAA;EACd,OAAO,UAAU;CACnB,CAAC;CAED,MAAM,OAAO,SAAgB;EAC3B,MAAM,MAAM,OAAO,IAAI;EACvB,UAAU,UAAU;GAClB,IAAI,OAAO,OACT,MAAM,IAAI,MACR,gCAAgC,IAAI,qBACtC;GAGF,MAAM,SAAS;IAAE;IAAM,SAAS;GAAK;GACrC,mBAAmB,KAAK,MAAM;GAE9B,OAAO;IACL,GAAG;KACF,MAAM,YAAY,KAAK,cAAc;KACpC,UAAU,UAAU;MAClB,MAAM,WAAW,EAAE,GAAG,MAAM;MAC5B,OAAO,SAAS;MAChB,OAAO;KACT,CAAC;IACH,CAAC;GACH;EACF,CAAC;CACH;CAEA,OAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ;CACF;AACF"}
@@ -1,15 +1,18 @@
1
- import { type ResourceElement } from "@assistant-ui/tap";
2
- import type { ClientMethods } from "./types/client.js";
1
+ import { ClientMethods } from "./types/client.js";
2
+ import { ResourceElement } from "@assistant-ui/tap";
3
+
4
+ //#region src/tapClientLookup.d.ts
3
5
  type InferClientState<TMethods> = TMethods extends {
4
- getState: () => infer S;
6
+ getState: () => infer S;
5
7
  } ? S : unknown;
6
- export declare function tapClientLookup<TMethods extends ClientMethods>(getElements: () => readonly ResourceElement<TMethods>[], getElementsDeps: readonly unknown[]): {
7
- state: InferClientState<TMethods>[];
8
- get: (lookup: {
9
- index: number;
10
- } | {
11
- key: string;
12
- }) => TMethods;
8
+ declare function tapClientLookup<TMethods extends ClientMethods>(getElements: () => readonly ResourceElement<TMethods>[], getElementsDeps: readonly unknown[]): {
9
+ state: InferClientState<TMethods>[];
10
+ get: (lookup: {
11
+ index: number;
12
+ } | {
13
+ key: string;
14
+ }) => TMethods;
13
15
  };
14
- export {};
16
+ //#endregion
17
+ export { tapClientLookup };
15
18
  //# sourceMappingURL=tapClientLookup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientLookup.d.ts","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAIpD,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,OAAO,CAAC;AAeZ,wBAAgB,eAAe,CAAC,QAAQ,SAAS,aAAa,EAC5D,WAAW,EAAE,MAAM,SAAS,eAAe,CAAC,QAAQ,CAAC,EAAE,EACvD,eAAe,EAAE,SAAS,OAAO,EAAE,GAClC;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;CAChE,CA2CA"}
1
+ {"version":3,"file":"tapClientLookup.d.ts","names":[],"sources":["../src/tapClientLookup.ts"],"mappings":";;;;KAUK,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,iBAgBY,eAAA,kBAAiC,aAAA,EAC/C,WAAA,iBAA4B,eAAA,CAAgB,QAAA,KAC5C,eAAA;EAEA,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,GAAA,GAAM,MAAA;IAAU,KAAA;EAAA;IAAoB,GAAA;EAAA,MAAkB,QAAA;AAAA"}
@@ -1,42 +1,36 @@
1
- import { tapMemo, tapResource, tapResources, } from "@assistant-ui/tap";
2
- import { ClientResource } from "./tapClientResource.js";
3
1
  import { wrapperResource } from "./wrapperResource.js";
2
+ import { ClientResource } from "./tapClientResource.js";
3
+ import { tapMemo, tapResource, tapResources } from "@assistant-ui/tap";
4
+ //#region src/tapClientLookup.ts
4
5
  const ClientResourceWithKey = wrapperResource((el) => {
5
- if (el.key === undefined) {
6
- throw new Error("tapClientResource: Element has no key");
7
- }
8
- return tapResource(ClientResource(el));
6
+ if (el.key === void 0) throw new Error("tapClientResource: Element has no key");
7
+ return tapResource(ClientResource(el));
9
8
  });
10
- export function tapClientLookup(getElements, getElementsDeps) {
11
- const resources = tapResources(() => getElements().map((el) => ClientResourceWithKey(el)),
12
- // biome-ignore lint/correctness/useExhaustiveDependencies: getElementsDeps is passed through from caller
13
- getElementsDeps);
14
- const keys = tapMemo(() => Object.keys(resources), [resources]);
15
- // For arrays, track element key -> index mapping
16
- const keyToIndex = tapMemo(() => {
17
- return resources.reduce((acc, resource, index) => {
18
- acc[resource.key] = index;
19
- return acc;
20
- }, {});
21
- }, [resources]);
22
- const state = tapMemo(() => {
23
- return resources.map((r) => r.state);
24
- }, [resources]);
25
- return {
26
- state,
27
- get: (lookup) => {
28
- if ("index" in lookup) {
29
- if (lookup.index < 0 || lookup.index >= keys.length) {
30
- throw new Error(`tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`);
31
- }
32
- return resources[lookup.index].methods;
33
- }
34
- const index = keyToIndex[lookup.key];
35
- if (index === undefined) {
36
- throw new Error(`tapClientLookup: Key "${lookup.key}" not found`);
37
- }
38
- return resources[index].methods;
39
- },
40
- };
9
+ function tapClientLookup(getElements, getElementsDeps) {
10
+ const resources = tapResources(() => getElements().map((el) => ClientResourceWithKey(el)), getElementsDeps);
11
+ const keys = tapMemo(() => Object.keys(resources), [resources]);
12
+ const keyToIndex = tapMemo(() => {
13
+ return resources.reduce((acc, resource, index) => {
14
+ acc[resource.key] = index;
15
+ return acc;
16
+ }, {});
17
+ }, [resources]);
18
+ return {
19
+ state: tapMemo(() => {
20
+ return resources.map((r) => r.state);
21
+ }, [resources]),
22
+ get: (lookup) => {
23
+ if ("index" in lookup) {
24
+ if (lookup.index < 0 || lookup.index >= keys.length) throw new Error(`tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`);
25
+ return resources[lookup.index].methods;
26
+ }
27
+ const index = keyToIndex[lookup.key];
28
+ if (index === void 0) throw new Error(`tapClientLookup: Key "${lookup.key}" not found`);
29
+ return resources[index].methods;
30
+ }
31
+ };
41
32
  }
33
+ //#endregion
34
+ export { tapClientLookup };
35
+
42
36
  //# sourceMappingURL=tapClientLookup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientLookup.js","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,EACX,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,+BAA4B;AACrD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AAQpD,MAAM,qBAAqB,GAAG,eAAe,CAC3C,CAAiC,EAA6B,EAAE,EAAE;IAChE,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAIpC,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,WAAuD,EACvD,eAAmC;IAKnC,MAAM,SAAS,GAAG,YAAY,CAC5B,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1D,yGAAyG;IACzG,eAAe,CAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhE,iDAAiD;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;YACvB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CAC7B,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,GAAG,EAAE,CAAC,MAA2C,EAAE,EAAE;YACnD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpD,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,KAAK,2BAA2B,IAAI,CAAC,MAAM,GAAG,CAChF,CAAC;gBACJ,CAAC;gBACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC;YAC1C,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,SAAS,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tapClientLookup.js","names":[],"sources":["../src/tapClientLookup.ts"],"sourcesContent":["import {\n tapMemo,\n tapResource,\n tapResources,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport { ClientResource } from \"./tapClientResource\";\nimport { wrapperResource } from \"./wrapperResource\";\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : unknown;\n\nconst ClientResourceWithKey = wrapperResource(\n <TMethods extends ClientMethods>(el: ResourceElement<TMethods>) => {\n if (el.key === undefined) {\n throw new Error(\"tapClientResource: Element has no key\");\n }\n return tapResource(ClientResource(el)) as {\n methods: TMethods;\n state: InferClientState<TMethods>;\n key: string | number;\n };\n },\n);\n\nexport function tapClientLookup<TMethods extends ClientMethods>(\n getElements: () => readonly ResourceElement<TMethods>[],\n getElementsDeps: readonly unknown[],\n): {\n state: InferClientState<TMethods>[];\n get: (lookup: { index: number } | { key: string }) => TMethods;\n} {\n const resources = tapResources(\n () => getElements().map((el) => ClientResourceWithKey(el)),\n // oxlint-disable-next-line tap-hooks/exhaustive-deps -- caller-supplied deps array\n getElementsDeps,\n );\n\n const keys = tapMemo(() => Object.keys(resources), [resources]);\n\n // For arrays, track element key -> index mapping\n const keyToIndex = tapMemo(() => {\n return resources.reduce(\n (acc, resource, index) => {\n acc[resource.key] = index;\n return acc;\n },\n {} as Record<string, number>,\n );\n }, [resources]);\n\n const state = tapMemo(() => {\n return resources.map((r) => r.state);\n }, [resources]);\n\n return {\n state,\n get: (lookup: { index: number } | { key: string }) => {\n if (\"index\" in lookup) {\n if (lookup.index < 0 || lookup.index >= keys.length) {\n throw new Error(\n `tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`,\n );\n }\n return resources[lookup.index]!.methods;\n }\n\n const index = keyToIndex[lookup.key];\n if (index === undefined) {\n throw new Error(`tapClientLookup: Key \"${lookup.key}\" not found`);\n }\n return resources[index]!.methods;\n },\n };\n}\n"],"mappings":";;;;AAgBA,MAAM,wBAAwB,iBACK,OAAkC;CACjE,IAAI,GAAG,QAAQ,KAAA,GACb,MAAM,IAAI,MAAM,uCAAuC;CAEzD,OAAO,YAAY,eAAe,EAAE,CAAC;AAKvC,CACF;AAEA,SAAgB,gBACd,aACA,iBAIA;CACA,MAAM,YAAY,mBACV,YAAY,EAAE,KAAK,OAAO,sBAAsB,EAAE,CAAC,GAEzD,eACF;CAEA,MAAM,OAAO,cAAc,OAAO,KAAK,SAAS,GAAG,CAAC,SAAS,CAAC;CAG9D,MAAM,aAAa,cAAc;EAC/B,OAAO,UAAU,QACd,KAAK,UAAU,UAAU;GACxB,IAAI,SAAS,OAAO;GACpB,OAAO;EACT,GACA,CAAC,CACH;CACF,GAAG,CAAC,SAAS,CAAC;CAMd,OAAO;EACL,OALY,cAAc;GAC1B,OAAO,UAAU,KAAK,MAAM,EAAE,KAAK;EACrC,GAAG,CAAC,SAAS,CAGP;EACJ,MAAM,WAAgD;GACpD,IAAI,WAAW,QAAQ;IACrB,IAAI,OAAO,QAAQ,KAAK,OAAO,SAAS,KAAK,QAC3C,MAAM,IAAI,MACR,0BAA0B,OAAO,MAAM,0BAA0B,KAAK,OAAO,EAC/E;IAEF,OAAO,UAAU,OAAO,OAAQ;GAClC;GAEA,MAAM,QAAQ,WAAW,OAAO;GAChC,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,yBAAyB,OAAO,IAAI,YAAY;GAElE,OAAO,UAAU,OAAQ;EAC3B;CACF;AACF"}
@@ -1,13 +1,16 @@
1
- import { type ResourceElement } from "@assistant-ui/tap";
2
- import type { ClientMethods } from "./types/client.js";
3
- export declare const getClientState: (client: ClientMethods) => any;
1
+ import { ClientMethods } from "./types/client.js";
2
+ import { ResourceElement } from "@assistant-ui/tap";
3
+
4
+ //#region src/tapClientResource.d.ts
5
+ declare const getClientState: (client: ClientMethods) => any;
4
6
  type InferClientState<TMethods> = TMethods extends {
5
- getState: () => infer S;
7
+ getState: () => infer S;
6
8
  } ? S : undefined;
7
- export declare const tapClientResource: <TMethods extends ClientMethods>(element: ResourceElement<TMethods>) => {
8
- state: InferClientState<TMethods>;
9
- methods: TMethods;
10
- key: string | number | undefined;
9
+ declare const tapClientResource: <TMethods extends ClientMethods>(element: ResourceElement<TMethods>) => {
10
+ state: InferClientState<TMethods>;
11
+ methods: TMethods;
12
+ key: string | number | undefined;
11
13
  };
12
- export {};
14
+ //#endregion
15
+ export { getClientState, tapClientResource };
13
16
  //# sourceMappingURL=tapClientResource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientResource.d.ts","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAsBpD,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,QASnD,CAAC;AAoIF,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,SAAS,CAAC;AAEd,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,aAAa,EAC9D,SAAS,eAAe,CAAC,QAAQ,CAAC,KACjC;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,QAAQ,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAOlC,CAAC"}
1
+ {"version":3,"file":"tapClientResource.d.ts","names":[],"sources":["../src/tapClientResource.ts"],"mappings":";;;;cA6Ba,cAAA,GAAkB,MAAqB,EAAb,aAAa;AAAA,KA6I/C,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,cAGS,iBAAA,oBAAsC,aAAA,EACjD,OAAA,EAAS,eAAA,CAAgB,QAAA;EAEzB,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,OAAA,EAAS,QAAA;EACT,GAAA;AAAA"}
@@ -1,114 +1,102 @@
1
- import { tapEffect, tapMemo, tapRef, tapResource, } from "@assistant-ui/tap";
2
- import { tapClientStack, tapWithClientStack, SYMBOL_CLIENT_INDEX, } from "./utils/tap-client-stack-context.js";
3
- import { BaseProxyHandler, handleIntrospectionProp, } from "./utils/BaseProxyHandler.js";
1
+ import { SYMBOL_CLIENT_INDEX, tapClientStack, tapWithClientStack } from "./utils/tap-client-stack-context.js";
2
+ import { BaseProxyHandler, handleIntrospectionProp } from "./utils/BaseProxyHandler.js";
4
3
  import { wrapperResource } from "./wrapperResource.js";
4
+ import { tapEffect, tapMemo, tapRef, tapResource } from "@assistant-ui/tap";
5
+ //#region src/tapClientResource.ts
5
6
  /**
6
- * Symbol used internally to get state from ClientProxy.
7
- * This allows getState() to be optional in the user-facing client.
8
- */
7
+ * Symbol used internally to get state from ClientProxy.
8
+ * This allows getState() to be optional in the user-facing client.
9
+ */
9
10
  const SYMBOL_GET_OUTPUT = Symbol("assistant-ui.store.getValue");
10
- export const getClientState = (client) => {
11
- const output = client[SYMBOL_GET_OUTPUT];
12
- if (!output) {
13
- throw new Error("Client scope contains a non-client resource. " +
14
- "Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.");
15
- }
16
- return output.getState?.();
11
+ const getClientState = (client) => {
12
+ const output = client[SYMBOL_GET_OUTPUT];
13
+ if (!output) throw new Error("Client scope contains a non-client resource. Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.");
14
+ return output.getState?.();
17
15
  };
18
- // Global cache for function templates by field name
19
- const fieldAccessFns = new Map();
16
+ const fieldAccessFns = /* @__PURE__ */ new Map();
20
17
  function getOrCreateProxyFn(prop) {
21
- let template = fieldAccessFns.get(prop);
22
- if (!template) {
23
- template = function (...args) {
24
- if (!this || typeof this !== "object") {
25
- throw new Error(`Method "${String(prop)}" called without proper context. ` +
26
- `This may indicate the function was called incorrectly.`);
27
- }
28
- const output = this[SYMBOL_GET_OUTPUT];
29
- if (!output) {
30
- throw new Error(`Method "${String(prop)}" called on invalid client proxy. ` +
31
- `Ensure you are calling this method on a valid client instance.`);
32
- }
33
- const method = output[prop];
34
- if (!method)
35
- throw new Error(`Method "${String(prop)}" is not implemented.`);
36
- if (typeof method !== "function")
37
- throw new Error(`"${String(prop)}" is not a function.`);
38
- return method(...args);
39
- };
40
- fieldAccessFns.set(prop, template);
41
- }
42
- return template;
43
- }
44
- class ClientProxyHandler extends BaseProxyHandler {
45
- outputRef;
46
- index;
47
- boundFns;
48
- cachedReceiver;
49
- constructor(outputRef, index) {
50
- super();
51
- this.outputRef = outputRef;
52
- this.index = index;
53
- }
54
- get(_, prop, receiver) {
55
- if (prop === SYMBOL_GET_OUTPUT)
56
- return this.outputRef.current;
57
- if (prop === SYMBOL_CLIENT_INDEX)
58
- return this.index;
59
- const introspection = handleIntrospectionProp(prop, "ClientProxy");
60
- if (introspection !== false)
61
- return introspection;
62
- const value = this.outputRef.current[prop];
63
- if (typeof value === "function") {
64
- if (this.cachedReceiver !== receiver) {
65
- this.boundFns = new Map();
66
- this.cachedReceiver = receiver;
67
- }
68
- let bound = this.boundFns.get(prop);
69
- if (!bound) {
70
- bound = getOrCreateProxyFn(prop).bind(receiver);
71
- this.boundFns.set(prop, bound);
72
- }
73
- return bound;
74
- }
75
- return value;
76
- }
77
- ownKeys() {
78
- return Object.keys(this.outputRef.current);
79
- }
80
- has(_, prop) {
81
- if (prop === SYMBOL_GET_OUTPUT)
82
- return true;
83
- if (prop === SYMBOL_CLIENT_INDEX)
84
- return true;
85
- return prop in this.outputRef.current;
86
- }
18
+ let template = fieldAccessFns.get(prop);
19
+ if (!template) {
20
+ template = function(...args) {
21
+ if (!this || typeof this !== "object") throw new Error(`Method "${String(prop)}" called without proper context. This may indicate the function was called incorrectly.`);
22
+ const output = this[SYMBOL_GET_OUTPUT];
23
+ if (!output) throw new Error(`Method "${String(prop)}" called on invalid client proxy. Ensure you are calling this method on a valid client instance.`);
24
+ const method = output[prop];
25
+ if (!method) throw new Error(`Method "${String(prop)}" is not implemented.`);
26
+ if (typeof method !== "function") throw new Error(`"${String(prop)}" is not a function.`);
27
+ return method(...args);
28
+ };
29
+ fieldAccessFns.set(prop, template);
30
+ }
31
+ return template;
87
32
  }
33
+ var ClientProxyHandler = class extends BaseProxyHandler {
34
+ outputRef;
35
+ index;
36
+ boundFns;
37
+ cachedReceiver;
38
+ constructor(outputRef, index) {
39
+ super();
40
+ this.outputRef = outputRef;
41
+ this.index = index;
42
+ }
43
+ get(_, prop, receiver) {
44
+ if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;
45
+ if (prop === SYMBOL_CLIENT_INDEX) return this.index;
46
+ const introspection = handleIntrospectionProp(prop, "ClientProxy");
47
+ if (introspection !== false) return introspection;
48
+ const value = this.outputRef.current[prop];
49
+ if (typeof value === "function") {
50
+ if (this.cachedReceiver !== receiver) {
51
+ this.boundFns = /* @__PURE__ */ new Map();
52
+ this.cachedReceiver = receiver;
53
+ }
54
+ let bound = this.boundFns.get(prop);
55
+ if (!bound) {
56
+ bound = getOrCreateProxyFn(prop).bind(receiver);
57
+ this.boundFns.set(prop, bound);
58
+ }
59
+ return bound;
60
+ }
61
+ return value;
62
+ }
63
+ ownKeys() {
64
+ return Object.keys(this.outputRef.current);
65
+ }
66
+ has(_, prop) {
67
+ if (prop === SYMBOL_GET_OUTPUT) return true;
68
+ if (prop === SYMBOL_CLIENT_INDEX) return true;
69
+ return prop in this.outputRef.current;
70
+ }
71
+ };
88
72
  /**
89
- * Resource that wraps a plain resource element to create a stable client proxy.
90
- *
91
- * Takes a ResourceElement that returns methods (with optional getState()) and
92
- * wraps it to produce a stable client proxy. This adds the client to the
93
- * client stack, enabling event scoping.
94
- *
95
- * @internal
96
- */
97
- export const ClientResource = wrapperResource((element) => {
98
- const valueRef = tapRef(null);
99
- const index = tapClientStack().length;
100
- const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]);
101
- const value = tapWithClientStack(methods, () => tapResource(element));
102
- if (!valueRef.current) {
103
- valueRef.current = value;
104
- }
105
- tapEffect(() => {
106
- valueRef.current = value;
107
- });
108
- const state = value.getState?.();
109
- return { methods, state, key: element.key };
73
+ * Resource that wraps a plain resource element to create a stable client proxy.
74
+ *
75
+ * Takes a ResourceElement that returns methods (with optional getState()) and
76
+ * wraps it to produce a stable client proxy. This adds the client to the
77
+ * client stack, enabling event scoping.
78
+ *
79
+ * @internal
80
+ */
81
+ const ClientResource = wrapperResource((element) => {
82
+ const valueRef = tapRef(null);
83
+ const index = tapClientStack().length;
84
+ const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]);
85
+ const value = tapWithClientStack(methods, () => tapResource(element));
86
+ if (!valueRef.current) valueRef.current = value;
87
+ tapEffect(() => {
88
+ valueRef.current = value;
89
+ });
90
+ return {
91
+ methods,
92
+ state: value.getState?.(),
93
+ key: element.key
94
+ };
110
95
  });
111
- export const tapClientResource = (element) => {
112
- return tapResource(ClientResource(element));
96
+ const tapClientResource = (element) => {
97
+ return tapResource(ClientResource(element));
113
98
  };
99
+ //#endregion
100
+ export { ClientResource, getClientState, tapClientResource };
101
+
114
102
  //# sourceMappingURL=tapClientResource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientResource.js","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tapClientResource.js","names":[],"sources":["../src/tapClientResource.ts"],"sourcesContent":["import {\n tapEffect,\n tapMemo,\n tapRef,\n type ResourceElement,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport {\n tapClientStack,\n tapWithClientStack,\n SYMBOL_CLIENT_INDEX,\n} from \"./utils/tap-client-stack-context\";\nimport {\n BaseProxyHandler,\n handleIntrospectionProp,\n} from \"./utils/BaseProxyHandler\";\nimport { wrapperResource } from \"./wrapperResource\";\n\n/**\n * Symbol used internally to get state from ClientProxy.\n * This allows getState() to be optional in the user-facing client.\n */\nconst SYMBOL_GET_OUTPUT = Symbol(\"assistant-ui.store.getValue\");\n\ntype ClientInternal = {\n [SYMBOL_GET_OUTPUT]: ClientMethods;\n};\n\nexport const getClientState = (client: ClientMethods) => {\n const output = (client as unknown as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n \"Client scope contains a non-client resource. \" +\n \"Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.\",\n );\n }\n return (output as any).getState?.();\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: unknown, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: unknown, ...args: unknown[]) {\n if (!this || typeof this !== \"object\") {\n throw new Error(\n `Method \"${String(prop)}\" called without proper context. ` +\n `This may indicate the function was called incorrectly.`,\n );\n }\n\n const output = (this as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n `Method \"${String(prop)}\" called on invalid client proxy. ` +\n `Ensure you are calling this method on a valid client instance.`,\n );\n }\n\n const method = output[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\n if (typeof method !== \"function\")\n throw new Error(`\"${String(prop)}\" is not a function.`);\n return method(...args);\n };\n fieldAccessFns.set(prop, template);\n }\n return template;\n}\n\nclass ClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<object>\n{\n private boundFns:\n | Map<string | symbol, (...args: never) => unknown>\n | undefined;\n private cachedReceiver: unknown;\n\n constructor(\n private readonly outputRef: {\n current: ClientMethods;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol, receiver: unknown) {\n if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;\n if (prop === SYMBOL_CLIENT_INDEX) return this.index;\n const introspection = handleIntrospectionProp(prop, \"ClientProxy\");\n if (introspection !== false) return introspection;\n const value = this.outputRef.current[prop];\n if (typeof value === \"function\") {\n if (this.cachedReceiver !== receiver) {\n this.boundFns = new Map();\n this.cachedReceiver = receiver;\n }\n let bound = this.boundFns!.get(prop);\n if (!bound) {\n bound = getOrCreateProxyFn(prop).bind(receiver);\n this.boundFns!.set(prop, bound);\n }\n return bound;\n }\n return value;\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current);\n }\n\n has(_: unknown, prop: string | symbol) {\n if (prop === SYMBOL_GET_OUTPUT) return true;\n if (prop === SYMBOL_CLIENT_INDEX) return true;\n return prop in this.outputRef.current;\n }\n}\n\n/**\n * Resource that wraps a plain resource element to create a stable client proxy.\n *\n * Takes a ResourceElement that returns methods (with optional getState()) and\n * wraps it to produce a stable client proxy. This adds the client to the\n * client stack, enabling event scoping.\n *\n * @internal\n */\nexport const ClientResource = wrapperResource(\n <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n ): {\n methods: TMethods;\n state: unknown;\n key: string | number | undefined;\n } => {\n const valueRef = tapRef(null as unknown as TMethods);\n\n const index = tapClientStack().length;\n const methods = tapMemo(\n () =>\n new Proxy<TMethods>(\n {} as TMethods,\n new ClientProxyHandler(valueRef, index),\n ),\n [index],\n );\n\n const value = tapWithClientStack(methods, () => tapResource(element));\n if (!valueRef.current) {\n valueRef.current = value;\n }\n\n tapEffect(() => {\n valueRef.current = value;\n });\n\n const state = (value as any).getState?.();\n return { methods, state, key: element.key };\n },\n);\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : undefined;\n\nexport const tapClientResource = <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n): {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n} => {\n return tapResource(ClientResource(element)) as {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n };\n};\n"],"mappings":";;;;;;;;;AAuBA,MAAM,oBAAoB,OAAO,6BAA6B;AAM9D,MAAa,kBAAkB,WAA0B;CACvD,MAAM,SAAU,OAAqC;CACrD,IAAI,CAAC,QACH,MAAM,IAAI,MACR,iJAEF;CAEF,OAAQ,OAAe,WAAW;AACpC;AAGA,MAAM,iCAAiB,IAAI,IAGzB;AAEF,SAAS,mBAAmB,MAAuB;CACjD,IAAI,WAAW,eAAe,IAAI,IAAI;CACtC,IAAI,CAAC,UAAU;EACb,WAAW,SAAyB,GAAG,MAAiB;GACtD,IAAI,CAAC,QAAQ,OAAO,SAAS,UAC3B,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,wFAE1B;GAGF,MAAM,SAAU,KAAwB;GACxC,IAAI,CAAC,QACH,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,iGAE1B;GAGF,MAAM,SAAS,OAAO;GACtB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,OAAO,IAAI,EAAE,sBAAsB;GAChE,IAAI,OAAO,WAAW,YACpB,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE,qBAAqB;GACxD,OAAO,OAAO,GAAG,IAAI;EACvB;EACA,eAAe,IAAI,MAAM,QAAQ;CACnC;CACA,OAAO;AACT;AAEA,IAAM,qBAAN,cACU,iBAEV;CAOqB;CAGA;CATnB;CAGA;CAEA,YACE,WAGA,OACA;EACA,MAAM;EALW,KAAA,YAAA;EAGA,KAAA,QAAA;CAGnB;CAEA,IAAI,GAAY,MAAuB,UAAmB;EACxD,IAAI,SAAS,mBAAmB,OAAO,KAAK,UAAU;EACtD,IAAI,SAAS,qBAAqB,OAAO,KAAK;EAC9C,MAAM,gBAAgB,wBAAwB,MAAM,aAAa;EACjE,IAAI,kBAAkB,OAAO,OAAO;EACpC,MAAM,QAAQ,KAAK,UAAU,QAAQ;EACrC,IAAI,OAAO,UAAU,YAAY;GAC/B,IAAI,KAAK,mBAAmB,UAAU;IACpC,KAAK,2BAAW,IAAI,IAAI;IACxB,KAAK,iBAAiB;GACxB;GACA,IAAI,QAAQ,KAAK,SAAU,IAAI,IAAI;GACnC,IAAI,CAAC,OAAO;IACV,QAAQ,mBAAmB,IAAI,EAAE,KAAK,QAAQ;IAC9C,KAAK,SAAU,IAAI,MAAM,KAAK;GAChC;GACA,OAAO;EACT;EACA,OAAO;CACT;CAEA,UAAsC;EACpC,OAAO,OAAO,KAAK,KAAK,UAAU,OAAO;CAC3C;CAEA,IAAI,GAAY,MAAuB;EACrC,IAAI,SAAS,mBAAmB,OAAO;EACvC,IAAI,SAAS,qBAAqB,OAAO;EACzC,OAAO,QAAQ,KAAK,UAAU;CAChC;AACF;;;;;;;;;;AAWA,MAAa,iBAAiB,iBAE1B,YAKG;CACH,MAAM,WAAW,OAAO,IAA2B;CAEnD,MAAM,QAAQ,eAAe,EAAE;CAC/B,MAAM,UAAU,cAEZ,IAAI,MACF,CAAC,GACD,IAAI,mBAAmB,UAAU,KAAK,CACxC,GACF,CAAC,KAAK,CACR;CAEA,MAAM,QAAQ,mBAAmB,eAAe,YAAY,OAAO,CAAC;CACpE,IAAI,CAAC,SAAS,SACZ,SAAS,UAAU;CAGrB,gBAAgB;EACd,SAAS,UAAU;CACrB,CAAC;CAGD,OAAO;EAAE;EAAS,OADH,MAAc,WAAW;EACf,KAAK,QAAQ;CAAI;AAC5C,CACF;AAQA,MAAa,qBACX,YAKG;CACH,OAAO,YAAY,eAAe,OAAO,CAAC;AAK5C"}