@assistant-ui/react 0.14.27 → 0.14.29

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 (257) hide show
  1. package/dist/client/ExternalThread.d.ts +11 -1
  2. package/dist/client/ExternalThread.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.js +758 -513
  4. package/dist/client/ExternalThread.js.map +1 -1
  5. package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
  6. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -1
  7. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  8. package/dist/legacy-runtime/cloud/auiV0.d.ts +12 -1
  9. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  10. package/dist/legacy-runtime/cloud/auiV0.js +2 -1
  11. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  12. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +1 -1
  13. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
  14. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +7 -6
  15. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
  16. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  17. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +30 -15
  18. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  19. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  20. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +8 -4
  21. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  22. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +1 -0
  23. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
  24. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  25. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  26. package/dist/model-context/makeAssistantVisible.js +7 -1
  27. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  28. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  29. package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  31. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
  32. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
  33. package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
  34. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  35. package/dist/primitives/actionBar/ActionBarRoot.js +3 -3
  36. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  37. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  38. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  39. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts +7 -6
  40. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts.map +1 -1
  41. package/dist/primitives/actionBar/useActionBarFloatStatus.js +10 -11
  42. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  43. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
  44. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  45. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
  46. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
  47. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
  48. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  49. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  50. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  51. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  52. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts.map +1 -1
  53. package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
  54. package/dist/primitives/attachment/AttachmentRemove.js +1 -0
  55. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  56. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  57. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  58. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  59. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  60. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  61. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  62. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  63. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  64. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +1 -0
  65. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  66. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
  67. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  68. package/dist/primitives/composer/ComposerAddAttachment.js +8 -2
  69. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  70. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  71. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -3
  72. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  73. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  74. package/dist/primitives/composer/ComposerDictate.d.ts.map +1 -1
  75. package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
  76. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  77. package/dist/primitives/composer/ComposerInput.js +6 -4
  78. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  79. package/dist/primitives/composer/ComposerQuote.d.ts.map +1 -1
  80. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  81. package/dist/primitives/composer/ComposerRoot.d.ts +5 -0
  82. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  83. package/dist/primitives/composer/ComposerRoot.js +86 -40
  84. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  85. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  86. package/dist/primitives/composer/ComposerSend.js +1 -0
  87. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  88. package/dist/primitives/composer/ComposerStopDictation.d.ts.map +1 -1
  89. package/dist/primitives/composer/ComposerStopDictation.js +1 -0
  90. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  91. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  92. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  93. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
  94. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
  95. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  96. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
  97. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  98. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  99. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  100. package/dist/primitives/composer/trigger/detectTrigger.d.ts +1 -1
  101. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  102. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  103. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  104. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  105. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -1
  106. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  107. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  108. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
  109. package/dist/primitives/message/MessageParts.js.map +1 -1
  110. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  111. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  112. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  113. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  114. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  115. package/dist/primitives/messagePart/useMessagePartData.d.ts +3 -2
  116. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  117. package/dist/primitives/messagePart/useMessagePartData.js +3 -2
  118. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  119. package/dist/primitives/messagePart/useMessagePartFile.d.ts +5 -4
  120. package/dist/primitives/messagePart/useMessagePartFile.d.ts.map +1 -1
  121. package/dist/primitives/messagePart/useMessagePartFile.js +11 -3
  122. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  123. package/dist/primitives/messagePart/useMessagePartImage.d.ts +5 -4
  124. package/dist/primitives/messagePart/useMessagePartImage.d.ts.map +1 -1
  125. package/dist/primitives/messagePart/useMessagePartImage.js +10 -3
  126. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  127. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts +5 -4
  128. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts.map +1 -1
  129. package/dist/primitives/messagePart/useMessagePartReasoning.js +10 -3
  130. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  131. package/dist/primitives/messagePart/useMessagePartSource.d.ts +6 -4
  132. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -1
  133. package/dist/primitives/messagePart/useMessagePartSource.js +12 -3
  134. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  135. package/dist/primitives/messagePart/useMessagePartText.d.ts +6 -5
  136. package/dist/primitives/messagePart/useMessagePartText.d.ts.map +1 -1
  137. package/dist/primitives/messagePart/useMessagePartText.js +10 -3
  138. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  139. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  140. package/dist/primitives/queueItem/QueueItemRemove.js +1 -0
  141. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  142. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  143. package/dist/primitives/queueItem/QueueItemSteer.js +1 -0
  144. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  145. package/dist/primitives/queueItem/QueueItemText.d.ts.map +1 -1
  146. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  147. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts.map +1 -1
  148. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts.map +1 -1
  149. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  150. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  151. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  152. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  153. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  154. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  155. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -0
  156. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  157. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  158. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  159. package/dist/primitives/thread/ThreadScrollToBottom.js +1 -0
  160. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  161. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  162. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  163. package/dist/primitives/thread/ThreadViewport.js +53 -19
  164. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  165. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  166. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -1
  167. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +4 -0
  168. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -1
  169. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +14 -1
  170. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  171. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +13 -1
  172. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -1
  173. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +14 -1
  174. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  175. package/dist/primitives/thread/useThreadViewportAutoScroll.js +2 -1
  176. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  177. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -1
  178. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  179. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  180. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  181. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  182. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  183. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  184. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  185. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  186. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  187. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  188. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  189. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  190. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  191. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  192. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  193. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  194. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  195. package/dist/tests/setup.d.ts +1 -1
  196. package/dist/utils/Primitive.d.ts.map +1 -1
  197. package/dist/utils/Primitive.js.map +1 -1
  198. package/dist/utils/createActionButton.d.ts.map +1 -1
  199. package/dist/utils/hooks/useOnResizeContent.js +1 -0
  200. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  201. package/dist/utils/hooks/useSizeHandle.js +1 -0
  202. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  203. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  204. package/dist/utils/smooth/useSmooth.js +2 -2
  205. package/dist/utils/smooth/useSmooth.js.map +1 -1
  206. package/package.json +20 -20
  207. package/src/client/ExternalThread.ts +341 -53
  208. package/src/legacy-runtime/cloud/auiV0.ts +14 -0
  209. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +4 -1
  210. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +37 -10
  211. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-delivery.test.tsx +79 -0
  212. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-parentid.test.tsx +97 -0
  213. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-scheduling.test.ts +113 -2
  214. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransport.spec.md +10 -2
  215. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.test.tsx +189 -0
  216. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +20 -4
  217. package/src/model-context/makeAssistantVisible.test.tsx +146 -0
  218. package/src/model-context/makeAssistantVisible.tsx +18 -1
  219. package/src/primitives/actionBar/useActionBarFloatStatus.ts +7 -5
  220. package/src/primitives/composer/ComposerAddAttachment.test.tsx +108 -0
  221. package/src/primitives/composer/ComposerAddAttachment.ts +10 -4
  222. package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +3 -2
  223. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +3 -2
  224. package/src/primitives/composer/ComposerInput.test.tsx +98 -1
  225. package/src/primitives/composer/ComposerInput.tsx +10 -8
  226. package/src/primitives/composer/ComposerRoot.test.tsx +226 -5
  227. package/src/primitives/composer/ComposerRoot.tsx +50 -1
  228. package/src/primitives/messagePart/useMessagePartData.ts +3 -2
  229. package/src/primitives/messagePart/useMessagePartFile.ts +19 -7
  230. package/src/primitives/messagePart/useMessagePartImage.ts +18 -7
  231. package/src/primitives/messagePart/useMessagePartReasoning.ts +15 -6
  232. package/src/primitives/messagePart/useMessagePartSource.ts +20 -7
  233. package/src/primitives/messagePart/useMessagePartText.ts +15 -5
  234. package/src/primitives/thread/ThreadViewport.tsx +15 -0
  235. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +243 -0
  236. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +28 -7
  237. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +69 -0
  238. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +29 -0
  239. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +86 -1
  240. package/src/primitives/thread/useThreadViewportAutoScroll.ts +6 -1
  241. package/src/tests/DataRenderers.test.tsx +212 -0
  242. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +1 -11
  243. package/src/tests/external-thread-attachments.test.tsx +372 -0
  244. package/src/tests/external-thread-parity.test.tsx +232 -0
  245. package/src/tests/generative-ui.test.tsx +1 -46
  246. package/src/tests/messagePartSwitchRace.test.tsx +172 -0
  247. package/src/tests/messagePartTypeMismatch.test.tsx +146 -0
  248. package/src/tests/threadMessageById.test.tsx +0 -7
  249. package/src/utils/smooth/useSmooth.ts +7 -4
  250. package/src/tests/BaseComposerRuntimeCore.test.ts +0 -612
  251. package/src/tests/BaseSubscribable.test.ts +0 -54
  252. package/src/tests/DataRenderers.test.ts +0 -355
  253. package/src/tests/ExternalStoreThreadRuntimeCore.test.ts +0 -685
  254. package/src/tests/LocalThreadRuntimeCore.test.ts +0 -324
  255. package/src/tests/auiV0Encode.test.ts +0 -188
  256. package/src/tests/external-message-converter.test.ts +0 -346
  257. package/src/tests/shouldContinue.test.ts +0 -122
@@ -1,355 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import type {
3
- DataMessagePartComponent,
4
- DataRenderersState,
5
- } from "@assistant-ui/core/react";
6
-
7
- // The resource in DataRenderers.ts requires fiber infrastructure, so these
8
- // tests replicate the reducer directly and exercise it in isolation.
9
-
10
- type StateHarness = {
11
- state: DataRenderersState;
12
- setDataUI: (name: string, render: DataMessagePartComponent) => () => void;
13
- setFallbackDataUI: (render: DataMessagePartComponent) => () => void;
14
- };
15
-
16
- const createState = (): StateHarness => {
17
- let state: DataRenderersState = { renderers: {}, fallbacks: [] };
18
-
19
- const setDataUI = (name: string, render: DataMessagePartComponent) => {
20
- state = {
21
- ...state,
22
- renderers: {
23
- ...state.renderers,
24
- [name]: [...(state.renderers[name] ?? []), render],
25
- },
26
- };
27
- return () => {
28
- state = {
29
- ...state,
30
- renderers: {
31
- ...state.renderers,
32
- [name]: state.renderers[name]?.filter((r) => r !== render) ?? [],
33
- },
34
- };
35
- };
36
- };
37
-
38
- const setFallbackDataUI = (render: DataMessagePartComponent) => {
39
- state = { ...state, fallbacks: [...state.fallbacks, render] };
40
- return () => {
41
- state = {
42
- ...state,
43
- fallbacks: state.fallbacks.filter((r) => r !== render),
44
- };
45
- };
46
- };
47
-
48
- return {
49
- get state() {
50
- return state;
51
- },
52
- setDataUI,
53
- setFallbackDataUI,
54
- };
55
- };
56
-
57
- describe("DataRenderers state logic", () => {
58
- describe("initial state", () => {
59
- it("should start with empty renderers and fallbacks", () => {
60
- const { state } = createState();
61
- expect(state.renderers).toEqual({});
62
- expect(state.fallbacks).toEqual([]);
63
- });
64
- });
65
-
66
- describe("setDataUI", () => {
67
- it("should register a data renderer", () => {
68
- const s = createState();
69
- const Component = (() => null) as unknown as DataMessagePartComponent;
70
-
71
- s.setDataUI("my-event", Component);
72
-
73
- expect(s.state.renderers["my-event"]).toHaveLength(1);
74
- expect(s.state.renderers["my-event"]![0]).toBe(Component);
75
- });
76
-
77
- it("should register multiple renderers for the same name", () => {
78
- const s = createState();
79
- const Component1 = (() => null) as unknown as DataMessagePartComponent;
80
- const Component2 = (() => null) as unknown as DataMessagePartComponent;
81
-
82
- s.setDataUI("my-event", Component1);
83
- s.setDataUI("my-event", Component2);
84
-
85
- expect(s.state.renderers["my-event"]).toHaveLength(2);
86
- expect(s.state.renderers["my-event"]![0]).toBe(Component1);
87
- expect(s.state.renderers["my-event"]![1]).toBe(Component2);
88
- });
89
-
90
- it("should register renderers for different names independently", () => {
91
- const s = createState();
92
- const Component1 = (() => null) as unknown as DataMessagePartComponent;
93
- const Component2 = (() => null) as unknown as DataMessagePartComponent;
94
-
95
- s.setDataUI("event-a", Component1);
96
- s.setDataUI("event-b", Component2);
97
-
98
- expect(s.state.renderers["event-a"]).toHaveLength(1);
99
- expect(s.state.renderers["event-b"]).toHaveLength(1);
100
- expect(s.state.renderers["event-a"]![0]).toBe(Component1);
101
- expect(s.state.renderers["event-b"]![0]).toBe(Component2);
102
- });
103
-
104
- it("should unregister a renderer when cleanup is called", () => {
105
- const s = createState();
106
- const Component = (() => null) as unknown as DataMessagePartComponent;
107
-
108
- const unsubscribe = s.setDataUI("my-event", Component);
109
- expect(s.state.renderers["my-event"]).toHaveLength(1);
110
-
111
- unsubscribe();
112
- expect(s.state.renderers["my-event"]).toHaveLength(0);
113
- });
114
-
115
- it("should only unregister the specific renderer on cleanup", () => {
116
- const s = createState();
117
- const Component1 = (() => null) as unknown as DataMessagePartComponent;
118
- const Component2 = (() => null) as unknown as DataMessagePartComponent;
119
-
120
- const unsub1 = s.setDataUI("my-event", Component1);
121
- s.setDataUI("my-event", Component2);
122
-
123
- unsub1();
124
-
125
- expect(s.state.renderers["my-event"]).toHaveLength(1);
126
- expect(s.state.renderers["my-event"]![0]).toBe(Component2);
127
- });
128
-
129
- it("should not affect other names when unregistering", () => {
130
- const s = createState();
131
- const Component1 = (() => null) as unknown as DataMessagePartComponent;
132
- const Component2 = (() => null) as unknown as DataMessagePartComponent;
133
-
134
- const unsub1 = s.setDataUI("event-a", Component1);
135
- s.setDataUI("event-b", Component2);
136
-
137
- unsub1();
138
-
139
- expect(s.state.renderers["event-a"]).toHaveLength(0);
140
- expect(s.state.renderers["event-b"]).toHaveLength(1);
141
- });
142
- });
143
- });
144
-
145
- describe("DataRenderers fallback state logic", () => {
146
- it("should register a fallback renderer", () => {
147
- const s = createState();
148
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
149
-
150
- s.setFallbackDataUI(Fallback);
151
-
152
- expect(s.state.fallbacks).toHaveLength(1);
153
- expect(s.state.fallbacks[0]).toBe(Fallback);
154
- });
155
-
156
- it("should unregister the fallback renderer on cleanup", () => {
157
- const s = createState();
158
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
159
-
160
- const unsub = s.setFallbackDataUI(Fallback);
161
- expect(s.state.fallbacks).toHaveLength(1);
162
-
163
- unsub();
164
- expect(s.state.fallbacks).toHaveLength(0);
165
- });
166
-
167
- it("should stack fallbacks; the first registered takes priority", () => {
168
- const s = createState();
169
- const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
170
- const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
171
-
172
- s.setFallbackDataUI(Fallback1);
173
- s.setFallbackDataUI(Fallback2);
174
-
175
- expect(s.state.fallbacks).toEqual([Fallback1, Fallback2]);
176
- });
177
-
178
- it("should only unregister the specific fallback on cleanup", () => {
179
- const s = createState();
180
- const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
181
- const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
182
-
183
- const unsub1 = s.setFallbackDataUI(Fallback1);
184
- s.setFallbackDataUI(Fallback2);
185
-
186
- unsub1();
187
- expect(s.state.fallbacks).toEqual([Fallback2]);
188
- });
189
-
190
- it("should restore the previous fallback when the active one unmounts", () => {
191
- const s = createState();
192
- const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
193
- const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
194
-
195
- s.setFallbackDataUI(Fallback1);
196
- const unsub2 = s.setFallbackDataUI(Fallback2);
197
-
198
- unsub2();
199
- expect(s.state.fallbacks).toEqual([Fallback1]);
200
- });
201
-
202
- it("should not affect named renderers when setting fallback", () => {
203
- const s = createState();
204
- const Named = (() => null) as unknown as DataMessagePartComponent;
205
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
206
-
207
- s.setDataUI("chart", Named);
208
- s.setFallbackDataUI(Fallback);
209
-
210
- expect(s.state.renderers["chart"]).toHaveLength(1);
211
- expect(s.state.renderers["chart"]![0]).toBe(Named);
212
- expect(s.state.fallbacks[0]).toBe(Fallback);
213
- });
214
- });
215
-
216
- describe("Data part component resolution", () => {
217
- const resolveDataComponent = (
218
- partName: string,
219
- inlineConfig?: {
220
- by_name?: Record<string, DataMessagePartComponent | undefined>;
221
- Fallback?: DataMessagePartComponent;
222
- },
223
- globalRenderers?: Record<string, DataMessagePartComponent[]>,
224
- globalFallbacks?: DataMessagePartComponent[],
225
- ): DataMessagePartComponent | undefined => {
226
- const named = globalRenderers?.[partName]?.[0];
227
- if (named) return named;
228
- const inlineFallback =
229
- inlineConfig?.by_name?.[partName] ?? inlineConfig?.Fallback;
230
- return globalFallbacks?.[0] ?? inlineFallback;
231
- };
232
-
233
- it("should return undefined when no config provided", () => {
234
- expect(resolveDataComponent("my-event")).toBeUndefined();
235
- });
236
-
237
- it("should return undefined when config has no matching name and no fallback", () => {
238
- expect(resolveDataComponent("my-event", { by_name: {} })).toBeUndefined();
239
- });
240
-
241
- it("should resolve by_name component", () => {
242
- const Component = (() => null) as unknown as DataMessagePartComponent;
243
- const result = resolveDataComponent("my-event", {
244
- by_name: { "my-event": Component },
245
- });
246
- expect(result).toBe(Component);
247
- });
248
-
249
- it("should fall back to Fallback when name not in by_name", () => {
250
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
251
- const result = resolveDataComponent("unknown-event", {
252
- by_name: {},
253
- Fallback,
254
- });
255
- expect(result).toBe(Fallback);
256
- });
257
-
258
- it("should prefer by_name over Fallback", () => {
259
- const SpecificComponent = (() =>
260
- null) as unknown as DataMessagePartComponent;
261
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
262
- const result = resolveDataComponent("my-event", {
263
- by_name: { "my-event": SpecificComponent },
264
- Fallback,
265
- });
266
- expect(result).toBe(SpecificComponent);
267
- });
268
-
269
- it("should prefer global registration over inline config", () => {
270
- const InlineComponent = (() => null) as unknown as DataMessagePartComponent;
271
- const GlobalComponent = (() => null) as unknown as DataMessagePartComponent;
272
-
273
- const result = resolveDataComponent(
274
- "my-event",
275
- { by_name: { "my-event": InlineComponent } },
276
- { "my-event": [GlobalComponent] },
277
- );
278
- expect(result).toBe(GlobalComponent);
279
- });
280
-
281
- it("should fall back to inline when global has no match", () => {
282
- const InlineComponent = (() => null) as unknown as DataMessagePartComponent;
283
-
284
- const result = resolveDataComponent(
285
- "my-event",
286
- { by_name: { "my-event": InlineComponent } },
287
- {},
288
- );
289
- expect(result).toBe(InlineComponent);
290
- });
291
-
292
- it("should fall back to inline Fallback when global has empty array", () => {
293
- const Fallback = (() => null) as unknown as DataMessagePartComponent;
294
-
295
- const result = resolveDataComponent(
296
- "my-event",
297
- { Fallback },
298
- { "my-event": [] },
299
- );
300
- expect(result).toBe(Fallback);
301
- });
302
-
303
- // --- Global fallback stack resolution ---
304
-
305
- it("should use global fallback when no name-specific renderer exists", () => {
306
- const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
307
-
308
- const result = resolveDataComponent("unknown-widget", undefined, {}, [
309
- GlobalFallback,
310
- ]);
311
- expect(result).toBe(GlobalFallback);
312
- });
313
-
314
- it("should prefer global name-match over global fallback", () => {
315
- const NamedComponent = (() => null) as unknown as DataMessagePartComponent;
316
- const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
317
-
318
- const result = resolveDataComponent(
319
- "chart",
320
- undefined,
321
- { chart: [NamedComponent] },
322
- [GlobalFallback],
323
- );
324
- expect(result).toBe(NamedComponent);
325
- });
326
-
327
- it("should prefer the first global fallback over inline Fallback", () => {
328
- const InlineFallback = (() => null) as unknown as DataMessagePartComponent;
329
- const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
330
-
331
- const result = resolveDataComponent(
332
- "unknown",
333
- { Fallback: InlineFallback },
334
- {},
335
- [GlobalFallback],
336
- );
337
- expect(result).toBe(GlobalFallback);
338
- });
339
-
340
- it("should pick the first registered when multiple fallbacks are stacked", () => {
341
- const First = (() => null) as unknown as DataMessagePartComponent;
342
- const Second = (() => null) as unknown as DataMessagePartComponent;
343
-
344
- const result = resolveDataComponent("anything", undefined, {}, [
345
- First,
346
- Second,
347
- ]);
348
- expect(result).toBe(First);
349
- });
350
-
351
- it("should return undefined when no fallbacks of any kind exist", () => {
352
- const result = resolveDataComponent("unknown", undefined, {}, []);
353
- expect(result).toBeUndefined();
354
- });
355
- });