@hubspot/ui-extensions 0.11.1 → 0.11.3

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 (236) hide show
  1. package/dist/__tests__/crm/hooks/useAssociations.spec.js +36 -32
  2. package/dist/__tests__/crm/hooks/useCrmProperties.spec.js +20 -19
  3. package/dist/__tests__/crm/utils/fetchAssociations.spec.js +13 -12
  4. package/dist/__tests__/crm/utils/fetchCrmProperties.spec.js +38 -37
  5. package/dist/clientTypes.d.ts +1 -0
  6. package/dist/clientTypes.js +1 -1
  7. package/dist/crm/hooks/useAssociations.d.ts +5 -3
  8. package/dist/crm/hooks/useAssociations.js +4 -2
  9. package/dist/crm/hooks/useCrmProperties.d.ts +4 -2
  10. package/dist/crm/hooks/useCrmProperties.js +4 -2
  11. package/dist/crm/index.d.ts +4 -4
  12. package/dist/crm/index.js +3 -3
  13. package/dist/crm/utils/fetchAssociations.d.ts +1 -1
  14. package/dist/experimental/index.d.ts +4 -4
  15. package/dist/experimental/index.js +3 -3
  16. package/dist/experimental/testing/__tests__/createRenderer.spec.js +23 -0
  17. package/dist/experimental/testing/__tests__/debug.spec.js +57 -0
  18. package/dist/experimental/testing/__tests__/find.spec.js +48 -0
  19. package/dist/experimental/testing/__tests__/findAll.spec.js +13 -0
  20. package/dist/experimental/testing/__tests__/findAllChildren.spec.js +54 -0
  21. package/dist/experimental/testing/__tests__/findByTestId.spec.js +126 -0
  22. package/dist/experimental/testing/__tests__/findChild.spec.js +33 -0
  23. package/dist/experimental/testing/__tests__/fragments.spec.js +66 -0
  24. package/dist/experimental/testing/__tests__/invalid-components.spec.js +96 -0
  25. package/dist/experimental/testing/__tests__/isMatch.spec.js +113 -0
  26. package/dist/experimental/testing/__tests__/logger.spec.js +10 -0
  27. package/dist/experimental/testing/__tests__/maybeFind.spec.js +67 -0
  28. package/dist/experimental/testing/__tests__/maybeFindByTestId.spec.js +65 -0
  29. package/dist/experimental/testing/__tests__/maybeFindChild.spec.js +75 -0
  30. package/dist/experimental/testing/__tests__/mocks.actions.spec.js +19 -0
  31. package/dist/experimental/testing/__tests__/mocks.context.spec.js +24 -0
  32. package/dist/experimental/testing/__tests__/mocks.runServerlessFunction.spec.js +35 -0
  33. package/dist/experimental/testing/__tests__/mocks.useAssociations.spec.js +47 -0
  34. package/dist/experimental/testing/__tests__/mocks.useCrmProperties.spec.js +58 -0
  35. package/dist/experimental/testing/__tests__/props.spec.js +13 -0
  36. package/dist/experimental/testing/__tests__/testId.spec.js +18 -0
  37. package/dist/experimental/testing/__tests__/trigger.spec.js +43 -0
  38. package/dist/experimental/testing/__tests__/type-utils.spec.js +165 -0
  39. package/dist/experimental/testing/__tests__/waitFor.spec.js +57 -0
  40. package/dist/experimental/testing/index.d.ts +4 -0
  41. package/dist/experimental/testing/index.js +4 -0
  42. package/dist/experimental/testing/internal/constants.d.ts +2 -2
  43. package/dist/experimental/testing/internal/constants.js +1 -1
  44. package/dist/experimental/testing/internal/convert.d.ts +10 -0
  45. package/dist/experimental/testing/internal/convert.js +149 -0
  46. package/dist/experimental/testing/internal/debug.d.ts +3 -3
  47. package/dist/experimental/testing/internal/debug.js +12 -4
  48. package/dist/experimental/testing/internal/document.d.ts +14 -0
  49. package/dist/experimental/testing/internal/document.js +40 -0
  50. package/dist/experimental/testing/internal/element.d.ts +4 -3
  51. package/dist/experimental/testing/internal/element.js +15 -10
  52. package/dist/experimental/testing/internal/errors.d.ts +57 -2
  53. package/dist/experimental/testing/internal/errors.js +62 -2
  54. package/dist/experimental/testing/internal/fragment.d.ts +3 -2
  55. package/dist/experimental/testing/internal/fragment.js +13 -9
  56. package/dist/experimental/testing/internal/match.d.ts +10 -0
  57. package/dist/experimental/testing/internal/match.js +19 -0
  58. package/dist/experimental/testing/internal/mocks/index.d.ts +17 -0
  59. package/dist/experimental/testing/internal/mocks/index.js +46 -0
  60. package/dist/experimental/testing/internal/mocks/mock-extension-point-api.d.ts +2 -0
  61. package/dist/experimental/testing/internal/mocks/mock-extension-point-api.js +166 -0
  62. package/dist/experimental/testing/internal/mocks/mock-hooks.d.ts +2 -0
  63. package/dist/experimental/testing/internal/mocks/mock-hooks.js +59 -0
  64. package/dist/experimental/testing/internal/print.d.ts +2 -2
  65. package/dist/experimental/testing/internal/print.js +17 -11
  66. package/dist/experimental/testing/internal/query.d.ts +19 -9
  67. package/dist/experimental/testing/internal/query.js +91 -46
  68. package/dist/experimental/testing/internal/root.d.ts +1 -1
  69. package/dist/experimental/testing/internal/root.js +12 -8
  70. package/dist/experimental/testing/internal/text.d.ts +3 -2
  71. package/dist/experimental/testing/internal/text.js +12 -3
  72. package/dist/experimental/testing/internal/type-utils-internal.d.ts +44 -0
  73. package/dist/experimental/testing/internal/type-utils-internal.js +54 -0
  74. package/dist/experimental/testing/internal/types-internal.d.ts +20 -2
  75. package/dist/experimental/testing/internal/utils/promise-utils.d.ts +14 -0
  76. package/dist/experimental/testing/internal/utils/promise-utils.js +14 -0
  77. package/dist/experimental/testing/render.d.ts +35 -0
  78. package/dist/experimental/testing/render.js +219 -0
  79. package/dist/experimental/testing/type-utils.d.ts +2 -2
  80. package/dist/experimental/testing/type-utils.js +1 -1
  81. package/dist/experimental/testing/types.d.ts +127 -9
  82. package/dist/experimental/testing/utils.d.ts +11 -0
  83. package/dist/experimental/testing/utils.js +24 -0
  84. package/dist/hubspot.d.ts +2 -4
  85. package/dist/hubspot.js +3 -3
  86. package/dist/index.d.ts +5 -5
  87. package/dist/index.js +5 -5
  88. package/dist/internal/global-utils.d.ts +6 -0
  89. package/dist/internal/global-utils.js +37 -0
  90. package/dist/internal/hook-utils.d.ts +19 -0
  91. package/dist/internal/hook-utils.js +34 -0
  92. package/dist/logger.d.ts +1 -8
  93. package/dist/logger.js +3 -2
  94. package/dist/pages/home/index.d.ts +1 -1
  95. package/dist/pages/home/index.js +1 -1
  96. package/dist/{__synced__/remoteComponents.synced.d.ts → shared/remoteComponents.d.ts} +159 -77
  97. package/dist/{__synced__/remoteComponents.synced.js → shared/remoteComponents.js} +99 -1
  98. package/dist/{__synced__/types/components/accordion.synced.d.ts → shared/types/components/accordion.d.ts} +2 -2
  99. package/dist/{__synced__/types/components/alert.synced.d.ts → shared/types/components/alert.d.ts} +2 -1
  100. package/dist/{__synced__/types/components/app-home-header-actions.synced.d.ts → shared/types/components/app-home-header-actions.d.ts} +4 -4
  101. package/dist/{__synced__/types/components/button-row.synced.d.ts → shared/types/components/button-row.d.ts} +2 -2
  102. package/dist/{__synced__/types/components/button.synced.d.ts → shared/types/components/button.d.ts} +9 -3
  103. package/dist/{__synced__/types/components/card.synced.d.ts → shared/types/components/card.d.ts} +2 -1
  104. package/dist/{__synced__/types/components/chart.synced.d.ts → shared/types/components/chart.d.ts} +2 -1
  105. package/dist/{__synced__/types/components/description-list.synced.d.ts → shared/types/components/description-list.d.ts} +3 -2
  106. package/dist/{__synced__/types/components/divider.synced.d.ts → shared/types/components/divider.d.ts} +2 -2
  107. package/dist/{__synced__/types/components/dropdown.synced.d.ts → shared/types/components/dropdown.d.ts} +5 -5
  108. package/dist/{__synced__/types/components/empty-state.synced.d.ts → shared/types/components/empty-state.d.ts} +2 -1
  109. package/dist/{__synced__/types/components/error-state.synced.d.ts → shared/types/components/error-state.d.ts} +2 -1
  110. package/dist/{__synced__/types/components/form.synced.d.ts → shared/types/components/form.d.ts} +3 -3
  111. package/dist/{__synced__/types/components/heading.synced.d.ts → shared/types/components/heading.d.ts} +2 -1
  112. package/dist/{__synced__/types/components/icon.synced.d.ts → shared/types/components/icon.d.ts} +2 -2
  113. package/dist/{__synced__/types/components/iframe.synced.d.ts → shared/types/components/iframe.d.ts} +2 -2
  114. package/dist/{__synced__/types/components/illustration.synced.d.ts → shared/types/components/illustration.d.ts} +2 -1
  115. package/dist/{__synced__/types/components/image.synced.d.ts → shared/types/components/image.d.ts} +3 -3
  116. package/dist/shared/types/components/index.d.ts +38 -0
  117. package/dist/shared/types/components/index.js +1 -0
  118. package/dist/{__synced__/types/components/inputs.synced.d.ts → shared/types/components/inputs.d.ts} +2 -1
  119. package/dist/shared/types/components/inputs.js +1 -0
  120. package/dist/{__synced__/types/components/layouts.synced.d.ts → shared/types/components/layouts.d.ts} +6 -6
  121. package/dist/shared/types/components/layouts.js +1 -0
  122. package/dist/{__synced__/types/components/link.synced.d.ts → shared/types/components/link.d.ts} +3 -3
  123. package/dist/shared/types/components/link.js +1 -0
  124. package/dist/{__synced__/types/components/list.synced.d.ts → shared/types/components/list.d.ts} +2 -1
  125. package/dist/shared/types/components/list.js +1 -0
  126. package/dist/{__synced__/types/components/loading-spinner.synced.d.ts → shared/types/components/loading-spinner.d.ts} +2 -2
  127. package/dist/shared/types/components/loading-spinner.js +1 -0
  128. package/dist/{__synced__/types/components/modal.synced.d.ts → shared/types/components/modal.d.ts} +4 -4
  129. package/dist/shared/types/components/modal.js +1 -0
  130. package/dist/{__synced__/types/components/panel.synced.d.ts → shared/types/components/panel.d.ts} +5 -5
  131. package/dist/shared/types/components/panel.js +1 -0
  132. package/dist/{__synced__/types/components/progress-bar.synced.d.ts → shared/types/components/progress-bar.d.ts} +2 -1
  133. package/dist/shared/types/components/progress-bar.js +1 -0
  134. package/dist/{__synced__/types/components/selects.synced.d.ts → shared/types/components/selects.d.ts} +2 -1
  135. package/dist/shared/types/components/selects.js +1 -0
  136. package/dist/{__synced__/types/components/statistics.synced.d.ts → shared/types/components/statistics.d.ts} +4 -3
  137. package/dist/shared/types/components/statistics.js +1 -0
  138. package/dist/{__synced__/types/components/status-tag.synced.d.ts → shared/types/components/status-tag.d.ts} +2 -1
  139. package/dist/shared/types/components/status-tag.js +1 -0
  140. package/dist/{__synced__/types/components/step-indicator.synced.d.ts → shared/types/components/step-indicator.d.ts} +2 -2
  141. package/dist/shared/types/components/step-indicator.js +1 -0
  142. package/dist/{__synced__/types/components/table.synced.d.ts → shared/types/components/table.d.ts} +5 -4
  143. package/dist/shared/types/components/table.js +1 -0
  144. package/dist/{__synced__/types/components/tabs.synced.d.ts → shared/types/components/tabs.d.ts} +3 -2
  145. package/dist/shared/types/components/tabs.js +1 -0
  146. package/dist/{__synced__/types/components/tag.synced.d.ts → shared/types/components/tag.d.ts} +3 -3
  147. package/dist/shared/types/components/tag.js +1 -0
  148. package/dist/{__synced__/types/components/text.synced.d.ts → shared/types/components/text.d.ts} +2 -1
  149. package/dist/shared/types/components/text.js +1 -0
  150. package/dist/{__synced__/types/components/tile.synced.d.ts → shared/types/components/tile.d.ts} +2 -1
  151. package/dist/shared/types/components/tile.js +1 -0
  152. package/dist/{__synced__/types/components/toggle.synced.d.ts → shared/types/components/toggle.d.ts} +2 -2
  153. package/dist/shared/types/components/toggle.js +1 -0
  154. package/dist/{__synced__/types/components/toggleInputs.synced.d.ts → shared/types/components/toggleInputs.d.ts} +4 -4
  155. package/dist/shared/types/components/toggleInputs.js +1 -0
  156. package/dist/{__synced__/types/components/tooltip.synced.d.ts → shared/types/components/tooltip.d.ts} +2 -1
  157. package/dist/shared/types/components/tooltip.js +1 -0
  158. package/dist/{__synced__/types/context.synced.d.ts → shared/types/context.d.ts} +1 -1
  159. package/dist/shared/types/context.js +1 -0
  160. package/dist/{__synced__/types/crm.synced.d.ts → shared/types/crm.d.ts} +13 -13
  161. package/dist/shared/types/crm.js +1 -0
  162. package/dist/{__synced__/experimental/types.synced.d.ts → shared/types/experimental.d.ts} +12 -17
  163. package/dist/shared/types/experimental.js +1 -0
  164. package/dist/shared/types/extend.d.ts +4 -0
  165. package/dist/shared/types/extend.js +1 -0
  166. package/dist/{__synced__/types/extension-points.synced.d.ts → shared/types/extension-points.d.ts} +18 -10
  167. package/dist/{__synced__/types/http-requests.synced.d.ts → shared/types/http-requests.d.ts} +1 -1
  168. package/dist/shared/types/index.d.ts +8 -0
  169. package/dist/shared/types/index.js +1 -0
  170. package/dist/shared/types/logger.d.ts +7 -0
  171. package/dist/shared/types/logger.js +1 -0
  172. package/dist/shared/types/reactions.js +1 -0
  173. package/dist/{__synced__/types/shared.synced.d.ts → shared/types/shared.d.ts} +3 -0
  174. package/dist/shared/types/worker-globals.d.ts +17 -0
  175. package/dist/shared/types/worker-globals.js +1 -0
  176. package/dist/{__synced__/utils/remote-component-registry.synced.d.ts → shared/utils/remote-component-registry.d.ts} +1 -1
  177. package/dist/{__synced__/utils/remote-component-registry.synced.js → shared/utils/remote-component-registry.js} +0 -1
  178. package/package.json +13 -14
  179. package/dist/__synced__/appHomeRemoteComponents.synced.d.ts +0 -28
  180. package/dist/__synced__/appHomeRemoteComponents.synced.js +0 -21
  181. package/dist/__synced__/crmRemoteComponents.synced.d.ts +0 -66
  182. package/dist/__synced__/crmRemoteComponents.synced.js +0 -15
  183. package/dist/__synced__/experimental/types.synced.js +0 -5
  184. package/dist/__synced__/experimentalRemoteComponents.synced.d.ts +0 -94
  185. package/dist/__synced__/experimentalRemoteComponents.synced.js +0 -56
  186. package/dist/__synced__/types/components/index.synced.d.ts +0 -38
  187. package/dist/__synced__/types/index.synced.d.ts +0 -8
  188. package/dist/__synced__/types/index.synced.js +0 -1
  189. /package/dist/{__synced__/types/actions.synced.js → experimental/testing/__tests__/createRenderer.spec.d.ts} +0 -0
  190. /package/dist/{__synced__/types/components/accordion.synced.js → experimental/testing/__tests__/debug.spec.d.ts} +0 -0
  191. /package/dist/{__synced__/types/components/alert.synced.js → experimental/testing/__tests__/find.spec.d.ts} +0 -0
  192. /package/dist/{__synced__/types/components/app-home-header-actions.synced.js → experimental/testing/__tests__/findAll.spec.d.ts} +0 -0
  193. /package/dist/{__synced__/types/components/button-row.synced.js → experimental/testing/__tests__/findAllChildren.spec.d.ts} +0 -0
  194. /package/dist/{__synced__/types/components/button.synced.js → experimental/testing/__tests__/findByTestId.spec.d.ts} +0 -0
  195. /package/dist/{__synced__/types/components/card.synced.js → experimental/testing/__tests__/findChild.spec.d.ts} +0 -0
  196. /package/dist/{__synced__/types/components/description-list.synced.js → experimental/testing/__tests__/fragments.spec.d.ts} +0 -0
  197. /package/dist/{__synced__/types/components/divider.synced.js → experimental/testing/__tests__/invalid-components.spec.d.ts} +0 -0
  198. /package/dist/{__synced__/types/components/dropdown.synced.js → experimental/testing/__tests__/isMatch.spec.d.ts} +0 -0
  199. /package/dist/{__synced__/types/components/empty-state.synced.js → experimental/testing/__tests__/logger.spec.d.ts} +0 -0
  200. /package/dist/{__synced__/types/components/error-state.synced.js → experimental/testing/__tests__/maybeFind.spec.d.ts} +0 -0
  201. /package/dist/{__synced__/types/components/form.synced.js → experimental/testing/__tests__/maybeFindByTestId.spec.d.ts} +0 -0
  202. /package/dist/{__synced__/types/components/heading.synced.js → experimental/testing/__tests__/maybeFindChild.spec.d.ts} +0 -0
  203. /package/dist/{__synced__/types/components/icon.synced.js → experimental/testing/__tests__/mocks.actions.spec.d.ts} +0 -0
  204. /package/dist/{__synced__/types/components/iframe.synced.js → experimental/testing/__tests__/mocks.context.spec.d.ts} +0 -0
  205. /package/dist/{__synced__/types/components/image.synced.js → experimental/testing/__tests__/mocks.runServerlessFunction.spec.d.ts} +0 -0
  206. /package/dist/{__synced__/types/components/index.synced.js → experimental/testing/__tests__/mocks.useAssociations.spec.d.ts} +0 -0
  207. /package/dist/{__synced__/types/components/inputs.synced.js → experimental/testing/__tests__/mocks.useCrmProperties.spec.d.ts} +0 -0
  208. /package/dist/{__synced__/types/components/layouts.synced.js → experimental/testing/__tests__/props.spec.d.ts} +0 -0
  209. /package/dist/{__synced__/types/components/link.synced.js → experimental/testing/__tests__/testId.spec.d.ts} +0 -0
  210. /package/dist/{__synced__/types/components/list.synced.js → experimental/testing/__tests__/trigger.spec.d.ts} +0 -0
  211. /package/dist/{__synced__/types/components/loading-spinner.synced.js → experimental/testing/__tests__/type-utils.spec.d.ts} +0 -0
  212. /package/dist/{__synced__/types/components/modal.synced.js → experimental/testing/__tests__/waitFor.spec.d.ts} +0 -0
  213. /package/dist/{__synced__/types/actions.synced.d.ts → shared/types/actions.d.ts} +0 -0
  214. /package/dist/{__synced__/types/components/panel.synced.js → shared/types/actions.js} +0 -0
  215. /package/dist/{__synced__/types/components/progress-bar.synced.js → shared/types/components/accordion.js} +0 -0
  216. /package/dist/{__synced__/types/components/selects.synced.js → shared/types/components/alert.js} +0 -0
  217. /package/dist/{__synced__/types/components/statistics.synced.js → shared/types/components/app-home-header-actions.js} +0 -0
  218. /package/dist/{__synced__/types/components/status-tag.synced.js → shared/types/components/button-row.js} +0 -0
  219. /package/dist/{__synced__/types/components/step-indicator.synced.js → shared/types/components/button.js} +0 -0
  220. /package/dist/{__synced__/types/components/table.synced.js → shared/types/components/card.js} +0 -0
  221. /package/dist/{__synced__/types/components/chart.synced.js → shared/types/components/chart.js} +0 -0
  222. /package/dist/{__synced__/types/components/tabs.synced.js → shared/types/components/description-list.js} +0 -0
  223. /package/dist/{__synced__/types/components/tag.synced.js → shared/types/components/divider.js} +0 -0
  224. /package/dist/{__synced__/types/components/text.synced.js → shared/types/components/dropdown.js} +0 -0
  225. /package/dist/{__synced__/types/components/tile.synced.js → shared/types/components/empty-state.js} +0 -0
  226. /package/dist/{__synced__/types/components/toggle.synced.js → shared/types/components/error-state.js} +0 -0
  227. /package/dist/{__synced__/types/components/toggleInputs.synced.js → shared/types/components/form.js} +0 -0
  228. /package/dist/{__synced__/types/components/tooltip.synced.js → shared/types/components/heading.js} +0 -0
  229. /package/dist/{__synced__/types/context.synced.js → shared/types/components/icon.js} +0 -0
  230. /package/dist/{__synced__/types/crm.synced.js → shared/types/components/iframe.js} +0 -0
  231. /package/dist/{__synced__/types/components/illustration.synced.js → shared/types/components/illustration.js} +0 -0
  232. /package/dist/{__synced__/types/reactions.synced.js → shared/types/components/image.js} +0 -0
  233. /package/dist/{__synced__/types/extension-points.synced.js → shared/types/extension-points.js} +0 -0
  234. /package/dist/{__synced__/types/http-requests.synced.js → shared/types/http-requests.js} +0 -0
  235. /package/dist/{__synced__/types/reactions.synced.d.ts → shared/types/reactions.d.ts} +0 -0
  236. /package/dist/{__synced__/types/shared.synced.js → shared/types/shared.js} +0 -0
@@ -1,5 +1,5 @@
1
- import { type FetchAssociationsRequest, type AssociationResult } from '../utils/fetchAssociations';
2
- import { type FetchCrmPropertiesOptions } from '../utils/fetchCrmProperties';
1
+ import { type FetchAssociationsRequest, type AssociationResult } from '../utils/fetchAssociations.ts';
2
+ import { type FetchCrmPropertiesOptions } from '../utils/fetchCrmProperties.ts';
3
3
  export interface UseAssociationsOptions {
4
4
  propertiesToFormat?: 'all' | string[];
5
5
  formattingOptions?: FetchCrmPropertiesOptions['formattingOptions'];
@@ -22,4 +22,6 @@ export interface UseAssociationsResult {
22
22
  /**
23
23
  * A hook to fetch and manage associations between CRM objects with pagination support.
24
24
  */
25
- export declare function useAssociations(config: Omit<FetchAssociationsRequest, 'offset'>, options?: UseAssociationsOptions): UseAssociationsResult;
25
+ declare function useAssociationsInternal(config: Omit<FetchAssociationsRequest, 'offset'>, options?: UseAssociationsOptions): UseAssociationsResult;
26
+ export declare const useAssociations: typeof useAssociationsInternal;
27
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { useEffect, useReducer, useMemo, useRef, useCallback } from 'react';
2
- import { fetchAssociations, DEFAULT_PAGE_SIZE, calculatePaginationFlags, } from '../utils/fetchAssociations';
2
+ import { fetchAssociations, DEFAULT_PAGE_SIZE, calculatePaginationFlags, } from "../utils/fetchAssociations.js";
3
+ import { createMockAwareHook } from "../../internal/hook-utils.js";
3
4
  function createInitialState(pageSize) {
4
5
  return {
5
6
  results: [],
@@ -82,7 +83,7 @@ const DEFAULT_OPTIONS = {};
82
83
  /**
83
84
  * A hook to fetch and manage associations between CRM objects with pagination support.
84
85
  */
85
- export function useAssociations(config, options = DEFAULT_OPTIONS) {
86
+ function useAssociationsInternal(config, options = DEFAULT_OPTIONS) {
86
87
  const pageSize = config?.pageLength ?? DEFAULT_PAGE_SIZE;
87
88
  const [state, dispatch] = useReducer(associationsReducer, useMemo(() => createInitialState(pageSize), [pageSize]));
88
89
  /**
@@ -202,3 +203,4 @@ export function useAssociations(config, options = DEFAULT_OPTIONS) {
202
203
  },
203
204
  };
204
205
  }
206
+ export const useAssociations = createMockAwareHook('useAssociations', useAssociationsInternal);
@@ -1,4 +1,4 @@
1
- import { type FetchCrmPropertiesOptions } from '../utils/fetchCrmProperties';
1
+ import { type FetchCrmPropertiesOptions } from '../utils/fetchCrmProperties.ts';
2
2
  export interface CrmPropertiesState {
3
3
  properties: Record<string, string | null>;
4
4
  error: Error | null;
@@ -7,4 +7,6 @@ export interface CrmPropertiesState {
7
7
  /**
8
8
  * A hook for using and managing CRM properties.
9
9
  */
10
- export declare function useCrmProperties(propertyNames: string[], options?: FetchCrmPropertiesOptions): CrmPropertiesState;
10
+ declare function useCrmPropertiesInternal(propertyNames: string[], options?: FetchCrmPropertiesOptions): CrmPropertiesState;
11
+ export declare const useCrmProperties: typeof useCrmPropertiesInternal;
12
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { useEffect, useReducer, useMemo, useRef } from 'react';
2
- import { fetchCrmProperties, } from '../utils/fetchCrmProperties';
2
+ import { fetchCrmProperties, } from "../utils/fetchCrmProperties.js";
3
+ import { createMockAwareHook } from "../../internal/hook-utils.js";
3
4
  const initialState = {
4
5
  properties: {},
5
6
  error: null,
@@ -35,7 +36,7 @@ const DEFAULT_OPTIONS = {};
35
36
  /**
36
37
  * A hook for using and managing CRM properties.
37
38
  */
38
- export function useCrmProperties(propertyNames, options = DEFAULT_OPTIONS) {
39
+ function useCrmPropertiesInternal(propertyNames, options = DEFAULT_OPTIONS) {
39
40
  const [state, dispatch] = useReducer(crmPropertiesReducer, initialState);
40
41
  /**
41
42
  * HOOK OPTIMIZATION:
@@ -107,3 +108,4 @@ export function useCrmProperties(propertyNames, options = DEFAULT_OPTIONS) {
107
108
  }, [stablePropertyNames, stableOptions]);
108
109
  return state;
109
110
  }
111
+ export const useCrmProperties = createMockAwareHook('useCrmProperties', useCrmPropertiesInternal);
@@ -1,4 +1,4 @@
1
- export { CrmPropertyList, CrmAssociationTable, CrmDataHighlight, CrmReport, CrmAssociationPivot, CrmAssociationPropertyList, CrmAssociationStageTracker, CrmSimpleDeadline, CrmStageTracker, CrmStatistics, CrmActionButton, CrmActionLink, CrmCardActions, } from '../__synced__/crmRemoteComponents.synced';
2
- export { useCrmProperties } from './hooks/useCrmProperties';
3
- export { useAssociations } from './hooks/useAssociations';
4
- export type * from '../__synced__/types/crm.synced';
1
+ export { CrmPropertyList, CrmAssociationTable, CrmDataHighlight, CrmReport, CrmAssociationPivot, CrmAssociationPropertyList, CrmAssociationStageTracker, CrmSimpleDeadline, CrmStageTracker, CrmStatistics, CrmActionButton, CrmActionLink, CrmCardActions, } from '../shared/remoteComponents.tsx';
2
+ export { useCrmProperties } from './hooks/useCrmProperties.ts';
3
+ export { useAssociations } from './hooks/useAssociations.ts';
4
+ export type * from '../shared/types/crm.ts';
package/dist/crm/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { CrmPropertyList, CrmAssociationTable, CrmDataHighlight, CrmReport, CrmAssociationPivot, CrmAssociationPropertyList, CrmAssociationStageTracker, CrmSimpleDeadline, CrmStageTracker, CrmStatistics, CrmActionButton, CrmActionLink, CrmCardActions, } from '../__synced__/crmRemoteComponents.synced';
2
- export { useCrmProperties } from './hooks/useCrmProperties';
3
- export { useAssociations } from './hooks/useAssociations';
1
+ export { CrmPropertyList, CrmAssociationTable, CrmDataHighlight, CrmReport, CrmAssociationPivot, CrmAssociationPropertyList, CrmAssociationStageTracker, CrmSimpleDeadline, CrmStageTracker, CrmStatistics, CrmActionButton, CrmActionLink, CrmCardActions, } from "../shared/remoteComponents.js";
2
+ export { useCrmProperties } from "./hooks/useCrmProperties.js";
3
+ export { useAssociations } from "./hooks/useAssociations.js";
@@ -1,4 +1,4 @@
1
- import { FetchCrmPropertiesOptions } from './fetchCrmProperties';
1
+ import { FetchCrmPropertiesOptions } from './fetchCrmProperties.ts';
2
2
  export declare const DEFAULT_PAGE_SIZE = 10;
3
3
  /**
4
4
  * Calculate pagination flags based on current page and API hasMore flag
@@ -1,4 +1,4 @@
1
- export { useCrmProperties } from '../crm/hooks/useCrmProperties';
2
- export { useAssociations } from '../crm/hooks/useAssociations';
3
- export { Iframe, MediaObject, Stack2, Center, GridItem, Grid, SettingsView, ExpandableText, Popover, FileInput, } from '../__synced__/experimentalRemoteComponents.synced';
4
- export type * from '../__synced__/experimental/types.synced';
1
+ export { useCrmProperties } from '../crm/hooks/useCrmProperties.ts';
2
+ export { useAssociations } from '../crm/hooks/useAssociations.ts';
3
+ export { Iframe, MediaObject, Stack2, Center, GridItem, Grid, SettingsView, ExpandableText, Popover, FileInput, } from '../shared/remoteComponents.tsx';
4
+ export type * from '../shared/types/experimental.ts';
@@ -1,3 +1,3 @@
1
- export { useCrmProperties } from '../crm/hooks/useCrmProperties';
2
- export { useAssociations } from '../crm/hooks/useAssociations';
3
- export { Iframe, MediaObject, Stack2, Center, GridItem, Grid, SettingsView, ExpandableText, Popover, FileInput, } from '../__synced__/experimentalRemoteComponents.synced';
1
+ export { useCrmProperties } from "../crm/hooks/useCrmProperties.js";
2
+ export { useAssociations } from "../crm/hooks/useAssociations.js";
3
+ export { Iframe, MediaObject, Stack2, Center, GridItem, Grid, SettingsView, ExpandableText, Popover, FileInput, } from "../shared/remoteComponents.js";
@@ -0,0 +1,23 @@
1
+ import { InvalidExtensionPointLocationError } from "../internal/errors.js";
2
+ import { createRenderer } from "../render.js";
3
+ describe('createRenderer', () => {
4
+ it('should create a renderer object', () => {
5
+ const renderer = createRenderer('crm.record.tab');
6
+ expect(renderer.render).toBeTypeOf('function');
7
+ });
8
+ it('should throw an error for an invalid extension point location', () => {
9
+ expect(() => {
10
+ createRenderer('INVALID_LOCATION');
11
+ }).toThrow(new InvalidExtensionPointLocationError('INVALID_LOCATION'));
12
+ });
13
+ it('should throw an error for an invalid extension point location with a helpful error message', () => {
14
+ let errorMessage;
15
+ try {
16
+ createRenderer('INVALID_LOCATION');
17
+ }
18
+ catch (error) {
19
+ errorMessage = String(error);
20
+ }
21
+ expect(errorMessage).toBe(`InvalidExtensionPointLocationError: Invalid extension point location of "INVALID_LOCATION". Allowed locations are: "crm.preview", "crm.record.sidebar", "crm.record.tab", "helpdesk.sidebar", "uie.playground.middle", "settings", "home"`);
22
+ });
23
+ });
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow, List, Text } from "../../../index.js";
4
+ import { createRenderer, isRenderedTextNode } from "../index.js";
5
+ function MyComponent() {
6
+ return (_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: _jsx(List, { children: _jsx(Text, { children: "Item 1" }) }), children: "Click me!" }) }), _jsx(Alert, { title: "My Alert" })] }));
7
+ }
8
+ describe('debugging', () => {
9
+ describe('toString', () => {
10
+ it('should allow the root node to be converted to a string', () => {
11
+ const { render, getRootNode } = createRenderer('crm.record.tab');
12
+ render(_jsx(MyComponent, {}));
13
+ expect(getRootNode().toString()).toMatchSnapshot();
14
+ });
15
+ it('should allow a component node to be converted to a string', () => {
16
+ const { render, find } = createRenderer('crm.record.tab');
17
+ render(_jsx(MyComponent, {}));
18
+ expect(find(Button).toString()).toMatchSnapshot();
19
+ });
20
+ });
21
+ describe('debugLog()', () => {
22
+ let consoleLogSpy;
23
+ beforeEach(() => {
24
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
25
+ });
26
+ afterEach(() => {
27
+ consoleLogSpy.mockRestore();
28
+ });
29
+ it('should allow debug logging the root node', () => {
30
+ const { render, debugLog } = createRenderer('crm.record.tab');
31
+ render(_jsx(MyComponent, {}));
32
+ debugLog('MY COMPONENT TREE');
33
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
34
+ });
35
+ it('should allow debug logging a component element node', () => {
36
+ const { render, find } = createRenderer('crm.record.tab');
37
+ render(_jsx(MyComponent, {}));
38
+ find(Button).debugLog('MY BUTTON');
39
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
40
+ });
41
+ it('should allow debug logging a component element node without a label', () => {
42
+ const { render, find } = createRenderer('crm.record.tab');
43
+ render(_jsx(MyComponent, {}));
44
+ find(Button).debugLog();
45
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
46
+ });
47
+ it('should allow debug logging a text node', () => {
48
+ const { render, find } = createRenderer('crm.record.tab');
49
+ render(_jsx(MyComponent, {}));
50
+ const buttonNode = find(Button);
51
+ const textNode = buttonNode.childNodes[0];
52
+ expect(isRenderedTextNode(textNode)).toBe(true);
53
+ textNode.debugLog('MY TEXT LABEL');
54
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
55
+ });
56
+ });
57
+ });
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow, Text } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ import { ComponentNotFoundError, FindInvalidComponentError, } from "../internal/errors.js";
6
+ describe('find()', () => {
7
+ it('should allow assertions against initial rendered output', () => {
8
+ const buttonLabel = 'Click me!';
9
+ const { render, find } = createRenderer('crm.record.tab');
10
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
11
+ const button = find(Button);
12
+ expect(button.props).toEqual({ variant: 'primary' });
13
+ expect(button.text).toEqual(buttonLabel);
14
+ });
15
+ it('should allow finding a matching component based on props object', () => {
16
+ const { render, find } = createRenderer('crm.record.tab');
17
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" })] }));
18
+ const primaryButton = find(Button, { variant: 'primary' });
19
+ expect(primaryButton.props).toMatchObject({ variant: 'primary' });
20
+ });
21
+ it('should allow finding a matching component based on a predicate function', () => {
22
+ const { render, find } = createRenderer('crm.record.tab');
23
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" })] }));
24
+ const primaryButton = find(Button, (node) => node.props.variant === 'primary');
25
+ expect(primaryButton.props).toMatchObject({ variant: 'primary' });
26
+ });
27
+ it('should throw an error when no match is found', () => {
28
+ const { render, find } = createRenderer('crm.record.tab');
29
+ render(_jsx(Alert, { title: "My Alert" }));
30
+ expect(() => find(Text)).toThrow(ComponentNotFoundError);
31
+ });
32
+ it('should throw an error when target component is invalid', () => {
33
+ const { render, find } = createRenderer('crm.record.tab');
34
+ render(_jsx(Alert, { title: "My Alert" }));
35
+ const MyFakeComponent = () => { };
36
+ expect(() => find(MyFakeComponent)).toThrow(FindInvalidComponentError);
37
+ });
38
+ it('should allow re-rendering and finding a matching component', () => {
39
+ const { render, find, maybeFind } = createRenderer('crm.record.tab');
40
+ render(_jsx(Alert, { title: "My Alert" }));
41
+ const alert = find(Alert);
42
+ expect(alert.props).toEqual({ title: 'My Alert' });
43
+ render(_jsx(Button, { variant: "primary", children: "Click me!" }));
44
+ const button = find(Button);
45
+ expect(button.props).toEqual({ variant: 'primary' });
46
+ expect(maybeFind(Alert)).toBeNull(); // The Alert should be gone now since we re-rendered.
47
+ });
48
+ });
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ describe('findAll()', () => {
6
+ it('should allow finding all matching components', () => {
7
+ const { render, findAll } = createRenderer('crm.record.tab');
8
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" })] }));
9
+ const buttons = findAll(Button);
10
+ expect(buttons[0]?.props).toMatchObject({ variant: 'secondary' });
11
+ expect(buttons[1]?.props).toMatchObject({ variant: 'primary' });
12
+ });
13
+ });
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow, Text } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ describe('findAllChildren()', () => {
6
+ it('should allow finding all direct children from the root node', () => {
7
+ const { render, findAllChildren } = createRenderer('crm.record.tab');
8
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" }), _jsx(Alert, { title: "Another Alert" })] }));
9
+ const alerts = findAllChildren(Alert);
10
+ expect(alerts).toHaveLength(2);
11
+ expect(alerts[0]?.props).toMatchObject({ title: 'My Alert' });
12
+ expect(alerts[1]?.props).toMatchObject({ title: 'Another Alert' });
13
+ });
14
+ it('should only find direct children, not nested descendants', () => {
15
+ const { render, findAllChildren } = createRenderer('crm.record.tab');
16
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" })] }));
17
+ const buttons = findAllChildren(Button);
18
+ expect(buttons).toHaveLength(0);
19
+ });
20
+ it('should allow finding all direct children from a nested component', () => {
21
+ const { render, find } = createRenderer('crm.record.tab');
22
+ render(_jsxs(_Fragment, { children: [_jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" })] }), _jsx(Alert, { title: "My Alert" })] }));
23
+ const buttonRow = find(ButtonRow);
24
+ const buttons = buttonRow.findAllChildren(Button);
25
+ expect(buttons).toHaveLength(2);
26
+ expect(buttons[0]?.props).toMatchObject({ variant: 'secondary' });
27
+ expect(buttons[1]?.props).toMatchObject({ variant: 'primary' });
28
+ });
29
+ it('should return empty array when no direct children match', () => {
30
+ const { render, findAllChildren } = createRenderer('crm.record.tab');
31
+ render(_jsx(_Fragment, { children: _jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: "Button 1" }) }) }));
32
+ const texts = findAllChildren(Text);
33
+ expect(texts).toHaveLength(0);
34
+ });
35
+ it('should support matcher function', () => {
36
+ const { render, find } = createRenderer('crm.record.tab');
37
+ render(_jsx(_Fragment, { children: _jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" }), _jsx(Button, { variant: "secondary", children: "Button 3" })] }) }));
38
+ const buttonRow = find(ButtonRow);
39
+ const secondaryButtons = buttonRow.findAllChildren(Button, (node) => node.props.variant === 'secondary');
40
+ expect(secondaryButtons).toHaveLength(2);
41
+ expect(secondaryButtons[0]?.props).toMatchObject({ variant: 'secondary' });
42
+ expect(secondaryButtons[1]?.props).toMatchObject({ variant: 'secondary' });
43
+ });
44
+ it('should support matcher object', () => {
45
+ const { render, find } = createRenderer('crm.record.tab');
46
+ render(_jsx(_Fragment, { children: _jsxs(ButtonRow, { children: [_jsx(Button, { variant: "secondary", children: "Button 1" }), _jsx(Button, { variant: "primary", children: "Button 2" }), _jsx(Button, { variant: "secondary", children: "Button 3" })] }) }));
47
+ const buttonRow = find(ButtonRow);
48
+ const primaryButtons = buttonRow.findAllChildren(Button, {
49
+ variant: 'primary',
50
+ });
51
+ expect(primaryButtons).toHaveLength(1);
52
+ expect(primaryButtons[0]?.props).toMatchObject({ variant: 'primary' });
53
+ });
54
+ });
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow, Text } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ import { ComponentMismatchedByTestIdError, ComponentNotFoundByTestIdError, FindInvalidComponentError, } from "../internal/errors.js";
6
+ describe('findByTestId()', () => {
7
+ it('should find a component by testId', () => {
8
+ const { render, findByTestId } = createRenderer('crm.record.tab');
9
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", testId: "primary-button", children: "Click me" }) }));
10
+ const button = findByTestId(Button, 'primary-button');
11
+ expect(button.props).toMatchObject({
12
+ variant: 'primary',
13
+ testId: 'primary-button',
14
+ });
15
+ expect(button.text).toEqual('Click me');
16
+ });
17
+ it('should find a component by testId among multiple components', () => {
18
+ const { render, findByTestId } = createRenderer('crm.record.tab');
19
+ render(_jsxs(_Fragment, { children: [_jsx(Button, { variant: "secondary", testId: "button-1", children: "Button 1" }), _jsx(Button, { variant: "primary", testId: "button-2", children: "Button 2" }), _jsx(Button, { variant: "destructive", testId: "button-3", children: "Button 3" })] }));
20
+ const button = findByTestId(Button, 'button-2');
21
+ expect(button.props).toMatchObject({
22
+ variant: 'primary',
23
+ testId: 'button-2',
24
+ });
25
+ expect(button.text).toEqual('Button 2');
26
+ });
27
+ it('should find a nested component by testId', () => {
28
+ const { render, findByTestId } = createRenderer('crm.record.tab');
29
+ render(_jsx(_Fragment, { children: _jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", testId: "nested-button", children: "Nested Button" }) }) }));
30
+ const button = findByTestId(Button, 'nested-button');
31
+ expect(button.props).toMatchObject({
32
+ variant: 'primary',
33
+ testId: 'nested-button',
34
+ });
35
+ expect(button.text).toEqual('Nested Button');
36
+ });
37
+ it('should find different component types by their testIds', () => {
38
+ const { render, findByTestId } = createRenderer('crm.record.tab');
39
+ render(_jsxs(_Fragment, { children: [_jsx(Button, { variant: "primary", testId: "my-button", children: "Click me" }), _jsx(Alert, { title: "My Alert", testId: "my-alert" })] }));
40
+ const button = findByTestId(Button, 'my-button');
41
+ expect(button.props).toMatchObject({
42
+ variant: 'primary',
43
+ testId: 'my-button',
44
+ });
45
+ const alert = findByTestId(Alert, 'my-alert');
46
+ expect(alert.props).toMatchObject({
47
+ title: 'My Alert',
48
+ testId: 'my-alert',
49
+ });
50
+ });
51
+ it('should throw ComponentNotFoundByTestIdError when testId is not found', () => {
52
+ const { render, findByTestId } = createRenderer('crm.record.tab');
53
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", testId: "existing-button", children: "Click me" }) }));
54
+ expect(() => findByTestId(Button, 'non-existent-testid')).toThrow(ComponentNotFoundByTestIdError);
55
+ });
56
+ it('should throw ComponentNotFoundByTestIdError when component has no testId', () => {
57
+ const { render, findByTestId } = createRenderer('crm.record.tab');
58
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", children: "Click me" }) }));
59
+ expect(() => findByTestId(Button, 'some-testid')).toThrow(ComponentNotFoundByTestIdError);
60
+ });
61
+ it('should throw ComponentNotFoundByTestIdError with a helpful message when component has no testId', () => {
62
+ const { render, findByTestId } = createRenderer('crm.record.tab');
63
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", children: "Click me" }) }));
64
+ let error = null;
65
+ try {
66
+ findByTestId(Button, 'some-testid');
67
+ }
68
+ catch (_error) {
69
+ error = _error;
70
+ }
71
+ expect(error).toBeInstanceOf(ComponentNotFoundByTestIdError);
72
+ expect(error?.message).toMatchSnapshot();
73
+ });
74
+ it('should throw ComponentMismatchedByTestIdError when testId exists but component type does not match', () => {
75
+ const { render, findByTestId } = createRenderer('crm.record.tab');
76
+ render(_jsxs(_Fragment, { children: [_jsx(Button, { variant: "primary", testId: "my-element", children: "Click me" }), _jsx(Alert, { title: "My Alert", testId: "my-alert" })] }));
77
+ expect(() => findByTestId(Alert, 'my-element')).toThrow(ComponentMismatchedByTestIdError);
78
+ });
79
+ it('should throw FindInvalidComponentError when target component is invalid', () => {
80
+ const { render, findByTestId } = createRenderer('crm.record.tab');
81
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", testId: "my-button", children: "Click me" }) }));
82
+ const MyFakeComponent = () => { };
83
+ expect(() => findByTestId(MyFakeComponent, 'my-button')).toThrow(FindInvalidComponentError);
84
+ });
85
+ it('should work after re-rendering with new components', () => {
86
+ const { render, findByTestId } = createRenderer('crm.record.tab');
87
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "primary", testId: "button-1", children: "Button 1" }) }));
88
+ let button = findByTestId(Button, 'button-1');
89
+ expect(button.text).toEqual('Button 1');
90
+ render(_jsx(_Fragment, { children: _jsx(Button, { variant: "secondary", testId: "button-2", children: "Button 2" }) }));
91
+ button = findByTestId(Button, 'button-2');
92
+ expect(button.text).toEqual('Button 2');
93
+ expect(() => findByTestId(Button, 'button-1')).toThrow(ComponentNotFoundByTestIdError);
94
+ });
95
+ it('should handle testIds with special characters', () => {
96
+ const { render, findByTestId } = createRenderer('crm.record.tab');
97
+ render(_jsxs(_Fragment, { children: [_jsx(Button, { variant: "primary", testId: "button-with-dashes-123", children: "Button 1" }), _jsx(Button, { variant: "secondary", testId: "button_with_underscores", children: "Button 2" }), _jsx(Button, { variant: "destructive", testId: "button.with.dots", children: "Button 3" })] }));
98
+ const button1 = findByTestId(Button, 'button-with-dashes-123');
99
+ expect(button1.props.variant).toEqual('primary');
100
+ const button2 = findByTestId(Button, 'button_with_underscores');
101
+ expect(button2.props.variant).toEqual('secondary');
102
+ const button3 = findByTestId(Button, 'button.with.dots');
103
+ expect(button3.props.variant).toEqual('destructive');
104
+ });
105
+ it('should work with deeply nested components', () => {
106
+ const { render, findByTestId } = createRenderer('crm.record.tab');
107
+ render(_jsx(_Fragment, { children: _jsx(ButtonRow, { children: _jsx(ButtonRow, { children: _jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", testId: "deeply-nested", children: "Deep Button" }) }) }) }) }));
108
+ const button = findByTestId(Button, 'deeply-nested');
109
+ expect(button.props).toMatchObject({
110
+ variant: 'primary',
111
+ testId: 'deeply-nested',
112
+ });
113
+ });
114
+ it('should find component by testId regardless of rendering order', () => {
115
+ const { render, findByTestId } = createRenderer('crm.record.tab');
116
+ render(_jsxs(_Fragment, { children: [_jsx(Text, { testId: "text-1", children: "First" }), _jsx(Button, { variant: "primary", testId: "button-1", children: "Button" }), _jsx(Alert, { title: "Alert", testId: "alert-1" }), _jsx(Text, { testId: "text-2", children: "Second" })] }));
117
+ const button = findByTestId(Button, 'button-1');
118
+ expect(button.props.variant).toEqual('primary');
119
+ const text1 = findByTestId(Text, 'text-1');
120
+ expect(text1.text).toEqual('First');
121
+ const text2 = findByTestId(Text, 'text-2');
122
+ expect(text2.text).toEqual('Second');
123
+ const alert = findByTestId(Alert, 'alert-1');
124
+ expect(alert.props.title).toEqual('Alert');
125
+ });
126
+ });
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ import { ComponentNotFoundError, FindInvalidComponentError, } from "../internal/errors.js";
6
+ describe('findChild()', () => {
7
+ it('should allow finding a child from the root node', () => {
8
+ const buttonLabel = '';
9
+ const { render, findChild } = createRenderer('crm.record.tab');
10
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
11
+ expect(findChild(ButtonRow)).toBeDefined();
12
+ });
13
+ it('should allow finding a child from a nested component', () => {
14
+ const buttonLabel = '';
15
+ const { render, find } = createRenderer('crm.record.tab');
16
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
17
+ const buttonRow = find(ButtonRow);
18
+ expect(buttonRow.findChild(Button).props).toEqual({ variant: 'primary' });
19
+ });
20
+ it('should throw an error when no match is found', () => {
21
+ const { render, find } = createRenderer('crm.record.tab');
22
+ render(_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: "Click me!" }) }));
23
+ const buttonRow = find(ButtonRow);
24
+ expect(() => buttonRow.findChild(Alert)).toThrow(ComponentNotFoundError);
25
+ });
26
+ it('should throw an error when target component is invalid', () => {
27
+ const { render, find } = createRenderer('crm.record.tab');
28
+ render(_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: "Click me!" }) }));
29
+ const MyFakeComponent = () => { };
30
+ const buttonRow = find(ButtonRow);
31
+ expect(() => buttonRow.findChild(MyFakeComponent)).toThrow(FindInvalidComponentError);
32
+ });
33
+ });
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Alert, Button, ButtonRow, List, Text } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ import { InvalidFragmentPropArrayError } from "../internal/errors.js";
6
+ describe('fragments', () => {
7
+ it('should allow assertions against components with fragment props', () => {
8
+ const buttonLabel = 'Click me!';
9
+ const { render, find } = createRenderer('crm.record.tab');
10
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: _jsx(List, { children: _jsx(Text, { children: "Item 1" }) }), children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
11
+ expect(find(Text).text).toEqual('Item 1');
12
+ expect(find(Button).text).toEqual(buttonLabel);
13
+ });
14
+ it('should handle undefined fragment props', () => {
15
+ const buttonLabel = 'Click me!';
16
+ const { render, find } = createRenderer('crm.record.tab');
17
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
18
+ const button = find(Button);
19
+ const { props: buttonProps } = button;
20
+ expect(buttonProps.overlay).toBeUndefined();
21
+ expect(find(Alert).props).toEqual({ title: 'My Alert' });
22
+ });
23
+ it('should handle null fragment props', () => {
24
+ const buttonLabel = 'Click me!';
25
+ const { render, find } = createRenderer('crm.record.tab');
26
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: null, children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
27
+ const button = find(Button);
28
+ const { props: buttonProps } = button;
29
+ expect(buttonProps.overlay?.childNodes).toHaveLength(0);
30
+ expect(find(Alert).props).toEqual({ title: 'My Alert' });
31
+ });
32
+ it('should throw an error if an array fragment prop is passed', () => {
33
+ const buttonLabel = 'Click me!';
34
+ const arrayProp = [1, 2, 3];
35
+ const { render } = createRenderer('crm.record.tab');
36
+ expect(() => {
37
+ render(_jsx(Button, { variant: "primary", overlay: arrayProp, children: buttonLabel }));
38
+ }).toThrow(InvalidFragmentPropArrayError);
39
+ });
40
+ it('should handle string fragment props', () => {
41
+ const buttonLabel = 'Click me!';
42
+ const { render, find } = createRenderer('crm.record.tab');
43
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: "My Overlay", children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
44
+ const button = find(Button);
45
+ expect(button.props.overlay?.text).toEqual('My Overlay');
46
+ expect(find(Alert).props).toEqual({ title: 'My Alert' });
47
+ });
48
+ it('should handle fragment props that are a JSX fragment', () => {
49
+ const buttonLabel = 'Click me!';
50
+ const { render, find } = createRenderer('crm.record.tab');
51
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: _jsx(_Fragment, { children: "My Overlay" }), children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
52
+ const button = find(Button);
53
+ expect(button.props.overlay?.text).toEqual('My Overlay');
54
+ expect(find(Alert).props).toEqual({ title: 'My Alert' });
55
+ });
56
+ it('should allow assertions against fragments rendered by a custom component', () => {
57
+ const buttonLabel = 'Click me!';
58
+ function MyOverlay() {
59
+ return (_jsx(List, { children: _jsx(Text, { children: "Item 1" }) }));
60
+ }
61
+ const { render, find } = createRenderer('crm.record.tab');
62
+ render(_jsxs(_Fragment, { children: [_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", overlay: _jsx(MyOverlay, {}), children: buttonLabel }) }), _jsx(Alert, { title: "My Alert" })] }));
63
+ expect(find(Text).text).toEqual('Item 1');
64
+ expect(find(Button).text).toEqual(buttonLabel);
65
+ });
66
+ });