@tambo-ai/react 0.12.0 → 0.12.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.
Files changed (137) hide show
  1. package/dist/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  2. package/dist/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
  3. package/dist/hooks/react-query-hooks.d.ts +1 -0
  4. package/dist/hooks/react-query-hooks.d.ts.map +1 -0
  5. package/dist/hooks/use-component-state.d.ts +1 -0
  6. package/dist/hooks/use-component-state.d.ts.map +1 -0
  7. package/dist/hooks/use-current-message.d.ts +1 -0
  8. package/dist/hooks/use-current-message.d.ts.map +1 -0
  9. package/dist/hooks/use-suggestions.d.ts +1 -0
  10. package/dist/hooks/use-suggestions.d.ts.map +1 -0
  11. package/dist/hooks/use-suggestions.js +2 -2
  12. package/dist/hooks/use-suggestions.js.map +1 -1
  13. package/dist/hooks/use-tambo-threads.d.ts +1 -0
  14. package/dist/hooks/use-tambo-threads.d.ts.map +1 -0
  15. package/dist/hooks/use-thread-input.d.ts +3 -0
  16. package/dist/hooks/use-thread-input.d.ts.map +1 -0
  17. package/dist/hooks/use-thread-input.js +2 -1
  18. package/dist/hooks/use-thread-input.js.map +1 -1
  19. package/dist/index.d.ts +4 -3
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/model/component-metadata.d.ts +1 -0
  23. package/dist/model/component-metadata.d.ts.map +1 -0
  24. package/dist/model/generate-component-response.d.ts +1 -0
  25. package/dist/model/generate-component-response.d.ts.map +1 -0
  26. package/dist/model/tambo-thread.d.ts +1 -0
  27. package/dist/model/tambo-thread.d.ts.map +1 -0
  28. package/dist/model/thread-input-error.d.ts +1 -0
  29. package/dist/model/thread-input-error.d.ts.map +1 -0
  30. package/dist/model/validate-input.d.ts +1 -0
  31. package/dist/model/validate-input.d.ts.map +1 -0
  32. package/dist/providers/index.d.ts +2 -1
  33. package/dist/providers/index.d.ts.map +1 -0
  34. package/dist/providers/index.js.map +1 -1
  35. package/dist/providers/tambo-client-provider.d.ts +1 -0
  36. package/dist/providers/tambo-client-provider.d.ts.map +1 -0
  37. package/dist/providers/tambo-component-provider.d.ts +1 -7
  38. package/dist/providers/tambo-component-provider.d.ts.map +1 -0
  39. package/dist/providers/tambo-component-provider.js +1 -66
  40. package/dist/providers/tambo-component-provider.js.map +1 -1
  41. package/dist/providers/tambo-provider.d.ts +1 -0
  42. package/dist/providers/tambo-provider.d.ts.map +1 -0
  43. package/dist/providers/tambo-registry-provider.d.ts +1 -0
  44. package/dist/providers/tambo-registry-provider.d.ts.map +1 -0
  45. package/dist/providers/tambo-thread-provider.d.ts +4 -0
  46. package/dist/providers/tambo-thread-provider.d.ts.map +1 -0
  47. package/dist/providers/tambo-thread-provider.js +14 -3
  48. package/dist/providers/tambo-thread-provider.js.map +1 -1
  49. package/dist/util/generate-component.d.ts +3 -3
  50. package/dist/util/generate-component.d.ts.map +1 -0
  51. package/dist/util/generate-component.js +0 -174
  52. package/dist/util/generate-component.js.map +1 -1
  53. package/dist/util/messages.d.ts +1 -0
  54. package/dist/util/messages.d.ts.map +1 -0
  55. package/dist/util/query-utils.d.ts +1 -0
  56. package/dist/util/query-utils.d.ts.map +1 -0
  57. package/dist/util/registry.d.ts +1 -0
  58. package/dist/util/registry.d.ts.map +1 -0
  59. package/dist/util/tool-caller.d.ts +1 -0
  60. package/dist/util/tool-caller.d.ts.map +1 -0
  61. package/dist/util/tool-caller.js +1 -1
  62. package/dist/util/tool-caller.js.map +1 -1
  63. package/esm/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  64. package/esm/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
  65. package/esm/hooks/react-query-hooks.d.ts +1 -0
  66. package/esm/hooks/react-query-hooks.d.ts.map +1 -0
  67. package/esm/hooks/use-component-state.d.ts +1 -0
  68. package/esm/hooks/use-component-state.d.ts.map +1 -0
  69. package/esm/hooks/use-current-message.d.ts +1 -0
  70. package/esm/hooks/use-current-message.d.ts.map +1 -0
  71. package/esm/hooks/use-suggestions.d.ts +1 -0
  72. package/esm/hooks/use-suggestions.d.ts.map +1 -0
  73. package/esm/hooks/use-suggestions.js +2 -2
  74. package/esm/hooks/use-suggestions.js.map +1 -1
  75. package/esm/hooks/use-tambo-threads.d.ts +1 -0
  76. package/esm/hooks/use-tambo-threads.d.ts.map +1 -0
  77. package/esm/hooks/use-thread-input.d.ts +3 -0
  78. package/esm/hooks/use-thread-input.d.ts.map +1 -0
  79. package/esm/hooks/use-thread-input.js +2 -1
  80. package/esm/hooks/use-thread-input.js.map +1 -1
  81. package/esm/index.d.ts +4 -3
  82. package/esm/index.d.ts.map +1 -0
  83. package/esm/index.js.map +1 -1
  84. package/esm/model/component-metadata.d.ts +1 -0
  85. package/esm/model/component-metadata.d.ts.map +1 -0
  86. package/esm/model/generate-component-response.d.ts +1 -0
  87. package/esm/model/generate-component-response.d.ts.map +1 -0
  88. package/esm/model/tambo-thread.d.ts +1 -0
  89. package/esm/model/tambo-thread.d.ts.map +1 -0
  90. package/esm/model/thread-input-error.d.ts +1 -0
  91. package/esm/model/thread-input-error.d.ts.map +1 -0
  92. package/esm/model/validate-input.d.ts +1 -0
  93. package/esm/model/validate-input.d.ts.map +1 -0
  94. package/esm/providers/index.d.ts +2 -1
  95. package/esm/providers/index.d.ts.map +1 -0
  96. package/esm/providers/index.js.map +1 -1
  97. package/esm/providers/tambo-client-provider.d.ts +1 -0
  98. package/esm/providers/tambo-client-provider.d.ts.map +1 -0
  99. package/esm/providers/tambo-component-provider.d.ts +1 -7
  100. package/esm/providers/tambo-component-provider.d.ts.map +1 -0
  101. package/esm/providers/tambo-component-provider.js +2 -67
  102. package/esm/providers/tambo-component-provider.js.map +1 -1
  103. package/esm/providers/tambo-provider.d.ts +1 -0
  104. package/esm/providers/tambo-provider.d.ts.map +1 -0
  105. package/esm/providers/tambo-registry-provider.d.ts +1 -0
  106. package/esm/providers/tambo-registry-provider.d.ts.map +1 -0
  107. package/esm/providers/tambo-thread-provider.d.ts +4 -0
  108. package/esm/providers/tambo-thread-provider.d.ts.map +1 -0
  109. package/esm/providers/tambo-thread-provider.js +15 -4
  110. package/esm/providers/tambo-thread-provider.js.map +1 -1
  111. package/esm/util/generate-component.d.ts +3 -3
  112. package/esm/util/generate-component.d.ts.map +1 -0
  113. package/esm/util/generate-component.js +1 -174
  114. package/esm/util/generate-component.js.map +1 -1
  115. package/esm/util/messages.d.ts +1 -0
  116. package/esm/util/messages.d.ts.map +1 -0
  117. package/esm/util/query-utils.d.ts +1 -0
  118. package/esm/util/query-utils.d.ts.map +1 -0
  119. package/esm/util/registry.d.ts +1 -0
  120. package/esm/util/registry.d.ts.map +1 -0
  121. package/esm/util/tool-caller.d.ts +1 -0
  122. package/esm/util/tool-caller.d.ts.map +1 -0
  123. package/esm/util/tool-caller.js +1 -1
  124. package/esm/util/tool-caller.js.map +1 -1
  125. package/package.json +7 -5
  126. package/dist/hooks/use-query-client.d.ts +0 -0
  127. package/dist/hooks/use-query-client.js +0 -2
  128. package/dist/hooks/use-query-client.js.map +0 -1
  129. package/dist/setupTests.d.ts +0 -1
  130. package/dist/setupTests.js +0 -20
  131. package/dist/setupTests.js.map +0 -1
  132. package/esm/hooks/use-query-client.d.ts +0 -0
  133. package/esm/hooks/use-query-client.js +0 -2
  134. package/esm/hooks/use-query-client.js.map +0 -1
  135. package/esm/setupTests.d.ts +0 -1
  136. package/esm/setupTests.js +0 -18
  137. package/esm/setupTests.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
- import { ComponentRegistry, TamboToolAssociations, TamboToolRegistry } from "../model/component-metadata";
3
- import { GenerationStage, TamboThreadMessage } from "../model/generate-component-response";
4
- export declare function generateAndHydrate(client: TamboAI, componentList: ComponentRegistry, toolRegistry: TamboToolRegistry, toolAssociations: TamboToolAssociations, currentThreadId: string | undefined, content: TamboAI.Beta.Threads.ChatCompletionContentPart[], params: TamboAI.Beta.Components.ComponentGenerateParams, onUpdateState: (state: GenerationStage) => void, stream?: boolean, options?: TamboAI.RequestOptions): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>>;
2
+ import { ComponentRegistry } from "../model/component-metadata";
3
+ import { TamboThreadMessage } from "../model/generate-component-response";
5
4
  /**
6
5
  * Generate a message that has a component rendered into it, if the message came with one
7
6
  */
8
7
  export declare function renderComponentIntoMessage(message: TamboAI.Beta.Threads.ThreadMessage, componentList: ComponentRegistry): TamboThreadMessage;
8
+ //# sourceMappingURL=generate-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAiCpB"}
@@ -1,153 +1,8 @@
1
- import { generateStream, hydrateStream, } from "@tambo-ai/typescript-sdk";
2
1
  import { parse } from "partial-json";
3
2
  import React from "react";
4
3
  import { z } from "zod";
5
4
  import { wrapWithTamboMessageProvider } from "../hooks/use-current-message";
6
- import { GenerationStage, } from "../model/generate-component-response";
7
- import { getAvailableComponents, getComponentFromRegistry, } from "../util/registry";
8
- import { handleToolCall } from "../util/tool-caller";
9
- export async function generateAndHydrate(client, componentList, toolRegistry, toolAssociations, currentThreadId, content, params, onUpdateState, stream = false, options) {
10
- const availableComponents = getAvailableComponents(componentList, toolRegistry, toolAssociations);
11
- let threadId = currentThreadId;
12
- onUpdateState(GenerationStage.CHOOSING_COMPONENT);
13
- try {
14
- if (stream) {
15
- const streamResponse = await generateStream(client, {
16
- availableComponents,
17
- contextKey: params.contextKey,
18
- content,
19
- threadId: params.threadId === "placeholder" ? undefined : params.threadId,
20
- }, options);
21
- return processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
22
- }
23
- const response = await client.beta.components.generate({
24
- availableComponents,
25
- contextKey: params.contextKey,
26
- content,
27
- threadId: params.threadId === "placeholder" ? undefined : params.threadId,
28
- }, options);
29
- // Capture the current threadId in case the following processComponentDecision fails
30
- threadId = response.message.threadId;
31
- return await processComponentDecision(client, componentList, toolRegistry, response.message.threadId, content, response.message, onUpdateState, options);
32
- }
33
- catch (error) {
34
- console.error(error);
35
- onUpdateState(GenerationStage.ERROR);
36
- // manually create a message with the error
37
- const errorMessage = `Error generating component: ${error}`;
38
- try {
39
- const errorMessageResponse = await client.beta.threads.messages.create(threadId ?? currentThreadId ?? "", {
40
- content: [{ type: "text", text: errorMessage }],
41
- role: "hydra",
42
- });
43
- return errorMessageResponse;
44
- }
45
- catch (errorError) {
46
- // Log to the console, there's nothing more we can do!
47
- console.error(`Error creating error message: ${errorError}`);
48
- console.error("Original error:", error);
49
- }
50
- return {
51
- renderedComponent: null,
52
- content: [{ type: "text", text: errorMessage }],
53
- role: "hydra",
54
- createdAt: new Date().toISOString(),
55
- id: crypto.randomUUID(),
56
- threadId: currentThreadId ?? "",
57
- };
58
- }
59
- }
60
- async function processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, message, onUpdateState, options) {
61
- if (!message.component?.componentName) {
62
- const componentResponse = {
63
- ...message,
64
- renderedComponent: null,
65
- };
66
- // no component to hydrate, just return the message
67
- onUpdateState(GenerationStage.COMPLETE);
68
- return componentResponse;
69
- }
70
- if (message.toolCallRequest) {
71
- onUpdateState(GenerationStage.FETCHING_CONTEXT);
72
- const toolResult = await handleToolCall(message, toolRegistry);
73
- onUpdateState(GenerationStage.HYDRATING_COMPONENT);
74
- try {
75
- const hydrationResponse = await client.beta.components.hydrate({
76
- component: getComponentFromRegistry(message.component.componentName, componentList),
77
- threadId: message.threadId,
78
- toolResponse: toolResult,
79
- }, options);
80
- return await processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, hydrationResponse.message, onUpdateState, options);
81
- }
82
- catch (error) {
83
- console.error(error);
84
- onUpdateState(GenerationStage.ERROR);
85
- return {
86
- threadId: message.threadId,
87
- renderedComponent: null,
88
- content: [
89
- { type: "text", text: `Error hydrating component: ${error}` },
90
- ],
91
- role: "hydra",
92
- createdAt: new Date().toISOString(),
93
- id: crypto.randomUUID(),
94
- };
95
- }
96
- }
97
- const renderedComponent = React.createElement(getComponentFromRegistry(message.component.componentName, componentList)
98
- .component, message.component.props);
99
- const componentResponse = {
100
- ...message,
101
- renderedComponent: wrapWithTamboMessageProvider(renderedComponent, message.threadId, message.id),
102
- };
103
- onUpdateState(GenerationStage.COMPLETE);
104
- return componentResponse;
105
- }
106
- async function* processComponentDecisionStream(stream, componentList, toolRegistry, onUpdateState, client, options) {
107
- let accumulatedComponentResponse = null;
108
- for await (const chunk of stream) {
109
- if (!chunk.component?.componentName) {
110
- onUpdateState(GenerationStage.STREAMING_RESPONSE);
111
- accumulatedComponentResponse = {
112
- ...chunk,
113
- renderedComponent: null,
114
- };
115
- yield accumulatedComponentResponse;
116
- }
117
- if (chunk.toolCallRequest) {
118
- if (!chunk.component?.componentName) {
119
- continue;
120
- }
121
- onUpdateState(GenerationStage.FETCHING_CONTEXT);
122
- const toolResult = await handleToolCall(chunk, toolRegistry);
123
- onUpdateState(GenerationStage.HYDRATING_COMPONENT);
124
- const streamResponse = await hydrateStream(client, {
125
- component: getComponentFromRegistry(chunk.component?.componentName ?? "", componentList),
126
- threadId: chunk.threadId,
127
- toolResponse: toolResult,
128
- }, options);
129
- yield* processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
130
- return;
131
- }
132
- if (chunk.component?.componentName) {
133
- try {
134
- onUpdateState(GenerationStage.STREAMING_RESPONSE);
135
- // Try to parse and validate accumulated component choice props:
136
- const messageWithComponent = renderComponentIntoMessage(chunk, componentList);
137
- // TODO: do we have to do this now
138
- accumulatedComponentResponse = {
139
- ...accumulatedComponentResponse,
140
- ...messageWithComponent,
141
- };
142
- yield messageWithComponent;
143
- }
144
- catch (error) {
145
- console.error(error);
146
- }
147
- }
148
- }
149
- onUpdateState(GenerationStage.COMPLETE);
150
- }
5
+ import { getComponentFromRegistry } from "../util/registry";
151
6
  /**
152
7
  * Generate a message that has a component rendered into it, if the message came with one
153
8
  */
@@ -171,32 +26,4 @@ export function renderComponentIntoMessage(message, componentList) {
171
26
  renderedComponent: wrappedComponent,
172
27
  };
173
28
  }
174
- async function* handleStream(stream) {
175
- let threadMessage = {
176
- threadId: "",
177
- content: [],
178
- role: "hydra",
179
- createdAt: new Date().toISOString(),
180
- id: crypto.randomUUID(),
181
- };
182
- try {
183
- for await (const chunk of stream) {
184
- threadMessage = {
185
- ...threadMessage,
186
- ...chunk,
187
- };
188
- yield threadMessage;
189
- }
190
- }
191
- catch (error) {
192
- console.error("Error processing stream:", error);
193
- yield {
194
- threadId: "",
195
- content: [{ type: "text", text: `Error processing stream: ${error}` }],
196
- role: "hydra",
197
- createdAt: new Date().toISOString(),
198
- id: crypto.randomUUID(),
199
- };
200
- }
201
- }
202
29
  //# sourceMappingURL=generate-component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"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","sourcesContent":["import TamboAI, {\n generateStream,\n hydrateStream,\n} from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport {\n ComponentRegistry,\n TamboToolAssociations,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport {\n getAvailableComponents,\n getComponentFromRegistry,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\n\nexport async function generateAndHydrate(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n toolAssociations: TamboToolAssociations,\n currentThreadId: string | undefined,\n content: TamboAI.Beta.Threads.ChatCompletionContentPart[],\n params: TamboAI.Beta.Components.ComponentGenerateParams,\n onUpdateState: (state: GenerationStage) => void,\n stream = false,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>> {\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n toolAssociations,\n );\n let threadId = currentThreadId;\n\n onUpdateState(GenerationStage.CHOOSING_COMPONENT);\n try {\n if (stream) {\n const streamResponse = await generateStream(\n client,\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n\n return processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentGenerateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n }\n const response = await client.beta.components.generate(\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n // Capture the current threadId in case the following processComponentDecision fails\n threadId = response.message.threadId;\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n response.message.threadId,\n content,\n response.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n // manually create a message with the error\n const errorMessage = `Error generating component: ${error}`;\n try {\n const errorMessageResponse = await client.beta.threads.messages.create(\n threadId ?? currentThreadId ?? \"\",\n {\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n },\n );\n return errorMessageResponse;\n } catch (errorError) {\n // Log to the console, there's nothing more we can do!\n console.error(`Error creating error message: ${errorError}`);\n console.error(\"Original error:\", error);\n }\n return {\n renderedComponent: null,\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n threadId: currentThreadId ?? \"\",\n };\n }\n}\n\nasync function processComponentDecision(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n currentThreadId: string,\n content: TamboAI.Beta.Components.ComponentGenerateParams[\"content\"],\n message: TamboAI.Beta.Threads.ThreadMessage,\n onUpdateState: (state: GenerationStage) => void,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage> {\n if (!message.component?.componentName) {\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: null,\n };\n // no component to hydrate, just return the message\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n }\n\n if (message.toolCallRequest) {\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(message, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n try {\n const hydrationResponse = await client.beta.components.hydrate(\n {\n component: getComponentFromRegistry(\n message.component.componentName,\n componentList,\n ),\n threadId: message.threadId,\n\n toolResponse: toolResult,\n },\n options,\n );\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n currentThreadId,\n content,\n hydrationResponse.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n return {\n threadId: message.threadId,\n renderedComponent: null,\n content: [\n { type: \"text\", text: `Error hydrating component: ${error}` },\n ],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n }\n\n const renderedComponent = React.createElement(\n getComponentFromRegistry(message.component.componentName, componentList)\n .component,\n message.component.props,\n );\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n ),\n };\n\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n}\n\nasync function* processComponentDecisionStream(\n stream: AsyncIterable<TamboThreadMessage>,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n onUpdateState: (state: GenerationStage) => void,\n client: TamboAI,\n options?: TamboAI.RequestOptions,\n): AsyncGenerator<TamboThreadMessage> {\n let accumulatedComponentResponse: TamboThreadMessage | null = null;\n\n for await (const chunk of stream) {\n if (!chunk.component?.componentName) {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n accumulatedComponentResponse = {\n ...chunk,\n renderedComponent: null,\n };\n yield accumulatedComponentResponse;\n }\n\n if (chunk.toolCallRequest) {\n if (!chunk.component?.componentName) {\n continue;\n }\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(chunk, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n const streamResponse = await hydrateStream(\n client,\n {\n component: getComponentFromRegistry(\n chunk.component?.componentName ?? \"\",\n componentList,\n ),\n threadId: chunk.threadId,\n toolResponse: toolResult,\n },\n options,\n );\n\n yield* processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentHydrateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n return;\n }\n\n if (chunk.component?.componentName) {\n try {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n // Try to parse and validate accumulated component choice props:\n const messageWithComponent = renderComponentIntoMessage(\n chunk,\n componentList,\n );\n // TODO: do we have to do this now\n accumulatedComponentResponse = {\n ...accumulatedComponentResponse,\n ...messageWithComponent,\n };\n yield messageWithComponent;\n } catch (error) {\n console.error(error);\n }\n }\n }\n onUpdateState(GenerationStage.COMPLETE);\n}\n\n/**\n * Generate a message that has a component rendered into it, if the message came with one\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n );\n\n return {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n renderedComponent: wrappedComponent,\n };\n}\n\nasync function* handleStream(\n stream: AsyncIterable<\n TamboAI.ComponentGenerateResponse | TamboAI.ComponentHydrateResponse\n >,\n): AsyncGenerator<TamboAI.Beta.Threads.ThreadMessage> {\n let threadMessage: TamboAI.Beta.Threads.ThreadMessage = {\n threadId: \"\",\n content: [],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n\n try {\n for await (const chunk of stream) {\n threadMessage = {\n ...threadMessage,\n ...chunk,\n };\n yield threadMessage;\n }\n } catch (error) {\n console.error(\"Error processing stream:\", error);\n yield {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream: ${error}` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAG5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,MAAM,cAAc,GAClB,mBAAmB,CAAC,KAAK,YAAY,CAAC,CAAC,OAAO;QAC5C,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,WAAW,CAAC;IAElB,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IACF,MAAM,gBAAgB,GAAG,4BAA4B,CACnD,iBAAiB,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,EAAE,CACX,CAAC;IAEF,OAAO;QACL,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;QACD,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message came with one\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n );\n\n return {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n renderedComponent: wrappedComponent,\n };\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
2
  export declare function threadMessagesToLegacyMessages(messages: TamboAI.Beta.Threads.ThreadMessage[]): TamboAI.Components.LegacyChatMessage[];
3
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/util/messages.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAE/C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,0CAU/C"}
@@ -3,3 +3,4 @@ export type CombinedMutationResult<TData = unknown, TError = unknown, TVariables
3
3
  export declare function combineMutationResults<TData1, TData2, TError1, TError2>(resultA: UseMutationResult<TData1, TError1, any, any>, resultB: UseMutationResult<TData2, TError2, any, any>): CombinedMutationResult<TData1 | TData2, TError1 | TError2>;
4
4
  export type CombinedQueryResult<TData1, TData2, TError1, TError2> = Omit<UseQueryResult<TData1 | TData2, TError1 | TError2>, "data" | "refetch" | "promise">;
5
5
  export declare function combineQueryResults<TData1, TData2, TError1, TError2>(resultA: UseQueryResult<TData1, TError1>, resultB: UseQueryResult<TData2, TError2>): CombinedQueryResult<void, void, TError1, TError2>;
6
+ //# sourceMappingURL=query-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-utils.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,MAAM,sBAAsB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,OAAO,EAChB,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,OAAO,IAChB,IAAI,CACN,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EACtD,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CACtE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EACrD,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GACpD,sBAAsB,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAsB5D;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CACtE,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,EAClD,MAAM,GAAG,SAAS,GAAG,SAAS,CAC/B,CAAC;AACF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAClE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAsCnD"}
@@ -5,3 +5,4 @@ export declare const getComponentFromRegistry: (componentName: string, component
5
5
  export declare const getDefaultContextAdditions: () => string[];
6
6
  export declare const getClientContext: () => string;
7
7
  export declare const mapTamboToolToContextTool: (tool: TamboTool) => ComponentContextToolMetadata;
8
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAG/C,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EAEjB,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,sBAAsB,GACjC,mBAAmB,iBAAiB,EACpC,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,OAAO,CAAC,kBAAkB,EAuB5B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,mBAAmB,iBAAiB,KACnC,mBAUF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,MAAM,EAMnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,MAGnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,MAAM,SAAS,KACd,4BAQF,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
2
  import { TamboToolRegistry } from "../model/component-metadata";
3
3
  export declare const handleToolCall: (message: TamboAI.Beta.ThreadMessage, toolRegistry: TamboToolRegistry) => Promise<any>;
4
+ //# sourceMappingURL=tool-caller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAEL,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,CAAC,IAAI,CAAC,aAAa,EACnC,cAAc,iBAAiB,iBAUhC,CAAC"}
@@ -21,6 +21,6 @@ const findTool = (toolName, toolRegistry) => {
21
21
  const runToolChoice = async (toolCallRequest, tool) => {
22
22
  // Assumes parameters are in the order they are defined in the tool
23
23
  const parameterValues = toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];
24
- return tool.getComponentContext(...parameterValues);
24
+ return await tool.getComponentContext(...parameterValues);
25
25
  };
26
26
  //# sourceMappingURL=tool-caller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AACtD,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { mapTamboToolToContextTool } from \"./registry\";\nexport const handleToolCall = async (\n message: TamboAI.Beta.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n) => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n const tool = findTool(message.toolCallRequest.toolName, toolRegistry);\n const toolResult = await runToolChoice(message.toolCallRequest, tool);\n\n return toolResult;\n};\n\nconst findTool = (toolName: string, toolRegistry: TamboToolRegistry) => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n): Promise<any> => {\n // Assumes parameters are in the order they are defined in the tool\n const parameterValues =\n toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];\n\n return tool.getComponentContext(...parameterValues);\n};\n"]}
1
+ {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { mapTamboToolToContextTool } from \"./registry\";\nexport const handleToolCall = async (\n message: TamboAI.Beta.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n) => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n const tool = findTool(message.toolCallRequest.toolName, toolRegistry);\n const toolResult = await runToolChoice(message.toolCallRequest, tool);\n\n return toolResult;\n};\n\nconst findTool = (toolName: string, toolRegistry: TamboToolRegistry) => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n): Promise<any> => {\n // Assumes parameters are in the order they are defined in the tool\n const parameterValues =\n toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];\n\n return await tool.getComponentContext(...parameterValues);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tambo-ai/react",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "React client package for Tambo AI",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,8 +33,7 @@
33
33
  "format": "prettier --write .",
34
34
  "lint": "eslint",
35
35
  "lint:fix": "eslint --fix",
36
- "format:lint": "npm run format && npm run lint:fix",
37
- "prepare": "husky"
36
+ "format:lint": "npm run format && npm run lint:fix"
38
37
  },
39
38
  "lint-staged": {
40
39
  "*.{js,jsx,ts,tsx}": [
@@ -53,13 +52,15 @@
53
52
  },
54
53
  "dependencies": {
55
54
  "@tambo-ai/typescript-sdk": "^0.31.0",
56
- "@tanstack/react-query": "^5.67.1",
55
+ "@tanstack/react-query": "^5.67.3",
57
56
  "partial-json": "^0.1.7",
58
57
  "zod": "^3.24.1",
59
58
  "zod-to-json-schema": "^3.24.1"
60
59
  },
61
60
  "devDependencies": {
62
61
  "@eslint/js": "^9.19.0",
62
+ "@tambo-ai/eslint-config": "*",
63
+ "@tambo-ai/typescript-config": "*",
63
64
  "@testing-library/jest-dom": "^6.4.2",
64
65
  "@testing-library/react": "^16.2.0",
65
66
  "@types/jest": "^29.5.12",
@@ -71,11 +72,12 @@
71
72
  "eslint": "^9.19.0",
72
73
  "eslint-plugin-react": "^7.37.4",
73
74
  "eslint-plugin-react-hooks": "^5.1.0",
74
- "husky": "^9.1.7",
75
75
  "jest": "^29.7.0",
76
76
  "jest-environment-jsdom": "^29.7.0",
77
77
  "lint-staged": "^15.4.3",
78
78
  "prettier": "^3.4.2",
79
+ "react": "^18.3.1",
80
+ "react-dom": "^18.3.1",
79
81
  "ts-jest": "^29.1.2",
80
82
  "ts-node": "^10.9.2",
81
83
  "typescript": "^5.7.3",
File without changes
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=use-query-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-query-client.js","sourceRoot":"","sources":["../../src/hooks/use-query-client.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -1 +0,0 @@
1
- import "@testing-library/jest-dom";
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("@testing-library/jest-dom");
4
- // Mock AbortController
5
- const mockSignal = {
6
- aborted: false,
7
- reason: undefined,
8
- onabort: null,
9
- addEventListener: jest.fn(),
10
- removeEventListener: jest.fn(),
11
- dispatchEvent: jest.fn(),
12
- throwIfAborted: jest.fn(),
13
- any: jest.fn(),
14
- };
15
- const MockAbortController = class {
16
- signal = mockSignal;
17
- abort = jest.fn();
18
- };
19
- global.AbortController = MockAbortController;
20
- //# sourceMappingURL=setupTests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../src/setupTests.ts"],"names":[],"mappings":";;AAAA,qCAAmC;AAEnC,uBAAuB;AACvB,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC3B,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC9B,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;IACxB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;IACzB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;CACW,CAAC;AAE5B,MAAM,mBAAmB,GAAG;IAC1B,MAAM,GAAG,UAAU,CAAC;IACpB,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;CACkB,CAAC;AAEvC,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC","sourcesContent":["import \"@testing-library/jest-dom\";\n\n// Mock AbortController\nconst mockSignal = {\n aborted: false,\n reason: undefined,\n onabort: null,\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\n dispatchEvent: jest.fn(),\n throwIfAborted: jest.fn(),\n any: jest.fn(),\n} as unknown as AbortSignal;\n\nconst MockAbortController = class {\n signal = mockSignal;\n abort = jest.fn();\n} as unknown as typeof AbortController;\n\nglobal.AbortController = MockAbortController;\n"]}
File without changes
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=use-query-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-query-client.js","sourceRoot":"","sources":["../../src/hooks/use-query-client.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -1 +0,0 @@
1
- import "@testing-library/jest-dom";
package/esm/setupTests.js DELETED
@@ -1,18 +0,0 @@
1
- import "@testing-library/jest-dom";
2
- // Mock AbortController
3
- const mockSignal = {
4
- aborted: false,
5
- reason: undefined,
6
- onabort: null,
7
- addEventListener: jest.fn(),
8
- removeEventListener: jest.fn(),
9
- dispatchEvent: jest.fn(),
10
- throwIfAborted: jest.fn(),
11
- any: jest.fn(),
12
- };
13
- const MockAbortController = class {
14
- signal = mockSignal;
15
- abort = jest.fn();
16
- };
17
- global.AbortController = MockAbortController;
18
- //# sourceMappingURL=setupTests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../src/setupTests.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AAEnC,uBAAuB;AACvB,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC3B,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC9B,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;IACxB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;IACzB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;CACW,CAAC;AAE5B,MAAM,mBAAmB,GAAG;IAC1B,MAAM,GAAG,UAAU,CAAC;IACpB,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;CACkB,CAAC;AAEvC,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC","sourcesContent":["import \"@testing-library/jest-dom\";\n\n// Mock AbortController\nconst mockSignal = {\n aborted: false,\n reason: undefined,\n onabort: null,\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\n dispatchEvent: jest.fn(),\n throwIfAborted: jest.fn(),\n any: jest.fn(),\n} as unknown as AbortSignal;\n\nconst MockAbortController = class {\n signal = mockSignal;\n abort = jest.fn();\n} as unknown as typeof AbortController;\n\nglobal.AbortController = MockAbortController;\n"]}