@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
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../../../index.js";
3
+ import { createRenderer } from "../index.js";
4
+ import { DuplicateTestIdError } from "../internal/errors.js";
5
+ describe('testId', () => {
6
+ it('should throw DuplicateTestIdError when testId is already in use', () => {
7
+ const { render } = createRenderer('crm.record.tab');
8
+ let error = null;
9
+ try {
10
+ render(_jsxs(_Fragment, { children: [_jsx(Button, { variant: "primary", testId: "my-button", children: "Click me" }), _jsx(Button, { variant: "secondary", testId: "my-button", children: "Click me" })] }));
11
+ }
12
+ catch (_error) {
13
+ error = _error;
14
+ }
15
+ expect(error).toBeInstanceOf(DuplicateTestIdError);
16
+ expect(error?.message).toMatchSnapshot();
17
+ });
18
+ });
@@ -0,0 +1,43 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { Button } from "../../../index.js";
5
+ import { createRenderer } from "../index.js";
6
+ import { InvalidEventFunctionError, MissingEventFunctionError, } from "../internal/errors.js";
7
+ describe('trigger()', () => {
8
+ it('should allow events to be triggered', () => {
9
+ function Counter() {
10
+ const [count, setCount] = useState(0);
11
+ const handleClick = () => {
12
+ setCount(count + 1);
13
+ };
14
+ return (_jsxs(Button, { variant: "primary", onClick: handleClick, children: ["Clicked ", count, " times"] }));
15
+ }
16
+ const { render, find } = createRenderer('crm.record.tab');
17
+ render(_jsx(Counter, {}));
18
+ expect(find(Button).text).toEqual('Clicked 0 times');
19
+ find(Button).trigger('onClick');
20
+ expect(find(Button).text).toEqual('Clicked 1 times');
21
+ });
22
+ it('should throw the correct error when a triggered event function is null', () => {
23
+ function Counter() {
24
+ return _jsx(Button, { variant: "primary", children: "Click me!" });
25
+ }
26
+ const { render, find } = createRenderer('crm.record.tab');
27
+ render(_jsx(Counter, {}));
28
+ expect(() => {
29
+ find(Button).trigger('onClick');
30
+ }).toThrow(MissingEventFunctionError);
31
+ });
32
+ it('should throw the correct error when a triggered event function is not a function but also not null', () => {
33
+ function Counter() {
34
+ const handleClick = {};
35
+ return (_jsx(Button, { variant: "primary", onClick: handleClick, children: "Click me!" }));
36
+ }
37
+ const { render, find } = createRenderer('crm.record.tab');
38
+ render(_jsx(Counter, {}));
39
+ expect(() => {
40
+ find(Button).trigger('onClick');
41
+ }).toThrow(InvalidEventFunctionError);
42
+ });
43
+ });
@@ -0,0 +1,165 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Button, ButtonRow, Text } from "../../../index.js";
4
+ import { createRenderer } from "../index.js";
5
+ import { isRenderedElementNode, isRenderedFragmentNode, isRenderedRootNode, isRenderedTextNode, } from "../type-utils.js";
6
+ import { RenderedNodeType } from "../types.js";
7
+ const TestComponent = () => (_jsx(Button, { overlay: _jsx(Text, { children: "Hello" }), children: "Text content" }));
8
+ const setupTestNodes = () => {
9
+ const { render, find, getRootNode } = createRenderer('crm.record.tab');
10
+ render(_jsx(TestComponent, {}));
11
+ const elementNode = find(Button);
12
+ const rootNode = getRootNode();
13
+ const textNode = find(Button).childNodes[0];
14
+ const fragmentNode = find(Button).props.overlay;
15
+ return {
16
+ elementNode,
17
+ textNode,
18
+ rootNode,
19
+ fragmentNode,
20
+ };
21
+ };
22
+ describe('type guard functions', () => {
23
+ describe('isRenderedElementNode()', () => {
24
+ it('should return true for an element node', () => {
25
+ const { elementNode } = setupTestNodes();
26
+ expect(isRenderedElementNode(elementNode)).toBe(true);
27
+ expect(elementNode.nodeType).toBe(RenderedNodeType.Element);
28
+ });
29
+ it('should return false for a text node', () => {
30
+ const { textNode } = setupTestNodes();
31
+ expect(isRenderedElementNode(textNode)).toBe(false);
32
+ });
33
+ it('should return false for a root node', () => {
34
+ const { rootNode } = setupTestNodes();
35
+ expect(isRenderedElementNode(rootNode)).toBe(false);
36
+ });
37
+ it('should return false for a fragment node', () => {
38
+ const { fragmentNode } = setupTestNodes();
39
+ expect(isRenderedElementNode(fragmentNode)).toBe(false);
40
+ });
41
+ it('should return false for null', () => {
42
+ expect(isRenderedElementNode(null)).toBe(false);
43
+ });
44
+ it('should return false for undefined', () => {
45
+ expect(isRenderedElementNode(undefined)).toBe(false);
46
+ });
47
+ });
48
+ describe('isRenderedTextNode()', () => {
49
+ it('should return true for a text node', () => {
50
+ const { textNode } = setupTestNodes();
51
+ expect(isRenderedTextNode(textNode)).toBe(true);
52
+ expect(textNode.nodeType).toBe(RenderedNodeType.Text);
53
+ });
54
+ it('should return false for an element node', () => {
55
+ const { elementNode } = setupTestNodes();
56
+ expect(isRenderedTextNode(elementNode)).toBe(false);
57
+ });
58
+ it('should return false for a root node', () => {
59
+ const { rootNode } = setupTestNodes();
60
+ expect(isRenderedTextNode(rootNode)).toBe(false);
61
+ });
62
+ it('should return false for a fragment node', () => {
63
+ const { fragmentNode } = setupTestNodes();
64
+ expect(isRenderedTextNode(fragmentNode)).toBe(false);
65
+ });
66
+ it('should return false for null', () => {
67
+ expect(isRenderedTextNode(null)).toBe(false);
68
+ });
69
+ it('should return false for undefined', () => {
70
+ expect(isRenderedTextNode(undefined)).toBe(false);
71
+ });
72
+ });
73
+ describe('isRenderedRootNode()', () => {
74
+ it('should return true for a root node', () => {
75
+ const { rootNode } = setupTestNodes();
76
+ expect(isRenderedRootNode(rootNode)).toBe(true);
77
+ expect(rootNode.nodeType).toBe(RenderedNodeType.Root);
78
+ });
79
+ it('should return false for an element node', () => {
80
+ const { elementNode } = setupTestNodes();
81
+ expect(isRenderedRootNode(elementNode)).toBe(false);
82
+ });
83
+ it('should return false for a text node', () => {
84
+ const { textNode } = setupTestNodes();
85
+ expect(isRenderedRootNode(textNode)).toBe(false);
86
+ });
87
+ it('should return false for a fragment node', () => {
88
+ const { fragmentNode } = setupTestNodes();
89
+ expect(isRenderedRootNode(fragmentNode)).toBe(false);
90
+ });
91
+ it('should return false for null', () => {
92
+ expect(isRenderedRootNode(null)).toBe(false);
93
+ });
94
+ it('should return false for undefined', () => {
95
+ expect(isRenderedRootNode(undefined)).toBe(false);
96
+ });
97
+ });
98
+ describe('isRenderedFragmentNode()', () => {
99
+ it('should return true for a fragment node', () => {
100
+ const { fragmentNode } = setupTestNodes();
101
+ expect(isRenderedFragmentNode(fragmentNode)).toBe(true);
102
+ expect(fragmentNode.nodeType).toBe(RenderedNodeType.Fragment);
103
+ });
104
+ it('should return false for an element node', () => {
105
+ const { elementNode } = setupTestNodes();
106
+ expect(isRenderedFragmentNode(elementNode)).toBe(false);
107
+ });
108
+ it('should return false for a text node', () => {
109
+ const { textNode } = setupTestNodes();
110
+ expect(isRenderedFragmentNode(textNode)).toBe(false);
111
+ });
112
+ it('should return false for a root node', () => {
113
+ const { rootNode } = setupTestNodes();
114
+ expect(isRenderedFragmentNode(rootNode)).toBe(false);
115
+ });
116
+ it('should return false for null', () => {
117
+ expect(isRenderedFragmentNode(null)).toBe(false);
118
+ });
119
+ it('should return false for undefined', () => {
120
+ expect(isRenderedFragmentNode(undefined)).toBe(false);
121
+ });
122
+ });
123
+ describe('type narrowing', () => {
124
+ it('should correctly narrow types for element nodes', () => {
125
+ const { render, find } = createRenderer('crm.record.tab');
126
+ render(_jsx(ButtonRow, { children: _jsx(Button, { variant: "primary", children: "Click me" }) }));
127
+ const buttonRow = find(ButtonRow);
128
+ const firstChild = buttonRow.childNodes[0];
129
+ if (isRenderedElementNode(firstChild)) {
130
+ expect(firstChild.name).toBe('Button');
131
+ expect(firstChild.props.variant).toBe('primary');
132
+ }
133
+ else {
134
+ throw new Error('Expected element node');
135
+ }
136
+ });
137
+ it('should correctly narrow types for text nodes', () => {
138
+ const { textNode } = setupTestNodes();
139
+ if (isRenderedTextNode(textNode)) {
140
+ expect(textNode.text).toBe('Text content');
141
+ }
142
+ else {
143
+ throw new Error('Expected text node');
144
+ }
145
+ });
146
+ it('should correctly narrow types for root nodes', () => {
147
+ const { rootNode } = setupTestNodes();
148
+ if (isRenderedRootNode(rootNode)) {
149
+ expect(rootNode.childNodes.length).toBeGreaterThan(0);
150
+ }
151
+ else {
152
+ throw new Error('Expected root node');
153
+ }
154
+ });
155
+ it('should correctly narrow types for fragment nodes', () => {
156
+ const { fragmentNode } = setupTestNodes();
157
+ if (isRenderedFragmentNode(fragmentNode)) {
158
+ expect(fragmentNode.childNodes.length).toBe(1);
159
+ }
160
+ else {
161
+ throw new Error('Expected fragment node');
162
+ }
163
+ });
164
+ });
165
+ });
@@ -0,0 +1,57 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { Button } from "../../../index.js";
5
+ import { createRenderer } from "../index.js";
6
+ import { WaitForTimeoutError } from "../internal/errors.js";
7
+ describe('waitFor()', () => {
8
+ beforeEach(() => {
9
+ // tell vitest we use mocked time
10
+ vi.useFakeTimers();
11
+ });
12
+ afterEach(() => {
13
+ // restoring date after each test run
14
+ vi.useRealTimers();
15
+ });
16
+ it('should allow for waiting for asynchronous updates', async () => {
17
+ function AsyncCounter() {
18
+ const [count, setCount] = useState(0);
19
+ useEffect(() => {
20
+ setTimeout(() => {
21
+ setCount((currentCount) => currentCount + 1);
22
+ }, 10);
23
+ }, []);
24
+ return _jsxs(Button, { variant: "primary", children: ["Count: ", count] });
25
+ }
26
+ const { render, find, waitFor } = createRenderer('crm.record.tab');
27
+ render(_jsx(AsyncCounter, {}));
28
+ expect(find(Button).text).toEqual('Count: 0');
29
+ const waitForPromise = waitFor(() => {
30
+ expect(find(Button).text).toEqual('Count: 1');
31
+ });
32
+ vi.advanceTimersByTimeAsync(100);
33
+ await waitForPromise;
34
+ });
35
+ it('should allow for waiting for asynchronous updates with a timeout', async () => {
36
+ vi.useFakeTimers();
37
+ function AsyncCounter() {
38
+ const [count, setCount] = useState(0);
39
+ useEffect(() => {
40
+ setTimeout(() => {
41
+ setCount((currentCount) => currentCount + 1);
42
+ }, 5000);
43
+ }, []);
44
+ return _jsxs(Button, { variant: "primary", children: ["Count: ", count] });
45
+ }
46
+ const { render, find, waitFor } = createRenderer('crm.record.tab');
47
+ render(_jsx(AsyncCounter, {}));
48
+ expect(find(Button).text).toEqual('Count: 0');
49
+ const waitForPromise = waitFor(() => {
50
+ expect(find(Button).text).toEqual('Count: 1');
51
+ });
52
+ // The default timeout is 1000ms, so we advance the timers by 5000ms to ensure the timeout is triggered.
53
+ vi.advanceTimersByTimeAsync(5000);
54
+ await expect(waitForPromise).rejects.toThrow(WaitForTimeoutError);
55
+ });
56
+ // TODO: Add a test for waiting for asynchronous updates with a custom timeout
57
+ });
@@ -0,0 +1,4 @@
1
+ export * from './type-utils.ts';
2
+ export * from './render.tsx';
3
+ export * from './types.ts';
4
+ export * from './utils.ts';
@@ -0,0 +1,4 @@
1
+ export * from "./type-utils.js";
2
+ export * from "./render.js";
3
+ export * from "./types.js";
4
+ export * from "./utils.js";
@@ -1,2 +1,2 @@
1
- import { type RenderedChildNode } from '../types';
2
- export declare const EMPTY_CHILDREN: RenderedChildNode[];
1
+ import { type RenderedChildNode } from '../types.ts';
2
+ export declare const EMPTY_RENDERED_CHILD_NODES: RenderedChildNode[];
@@ -1 +1 @@
1
- export const EMPTY_CHILDREN = [];
1
+ export const EMPTY_RENDERED_CHILD_NODES = [];
@@ -0,0 +1,10 @@
1
+ import { type RemoteRoot } from '@remote-ui/core';
2
+ import type { RenderedRootNodeInternal } from './types-internal.ts';
3
+ /**
4
+ * Converts a remote root node to a rendered root node. After conversion, the rendered root node will
5
+ * have its `childNodes` property set to the converted child nodes.
6
+ *
7
+ * @param rootNode The rendered root node to convert.
8
+ * @param remoteRoot The remote root node to convert.
9
+ */
10
+ export declare const convertRemoteRoot: (rootNode: RenderedRootNodeInternal, remoteRoot: RemoteRoot) => void;
@@ -0,0 +1,149 @@
1
+ import { KIND_COMPONENT, KIND_FRAGMENT, KIND_TEXT, } from '@remote-ui/core';
2
+ import { createElementNode } from "./element.js";
3
+ import { DuplicateTestIdError, InvalidFragmentPropArrayError, } from "./errors.js";
4
+ import { createFragmentNode } from "./fragment.js";
5
+ import { createTextNode } from "./text.js";
6
+ import { __hubSpotComponentRegistry } from "../../../shared/remoteComponents.js";
7
+ import { isRenderedTextNode } from "../type-utils.js";
8
+ import { EMPTY_RENDERED_CHILD_NODES } from "./constants.js";
9
+ import { asRenderedParentNode } from "./type-utils-internal.js";
10
+ /* eslint-disable @typescript-eslint/no-use-before-define */
11
+ /**
12
+ * Converts a remote props object to a props object that can be attached to a rendered element node.
13
+ *
14
+ * @param document The document to use for creating new nodes.
15
+ * @param componentName The name of the component to convert the props for.
16
+ * @param remoteProps The remote props object to convert.
17
+ * @returns The rendered props object.
18
+ */
19
+ const convertRemoteProps = (document, componentName, remoteProps) => {
20
+ if (typeof remoteProps !== 'object' || remoteProps == null) {
21
+ return {};
22
+ }
23
+ const convertedProps = {};
24
+ for (const [propName, remotePropValue] of Object.entries(remoteProps)) {
25
+ if (propName === 'children') {
26
+ // Skip over `children` props since we created nested nodes in our tree for children
27
+ continue;
28
+ }
29
+ if (__hubSpotComponentRegistry.isComponentFragmentProp(componentName, propName)) {
30
+ if (Array.isArray(remotePropValue)) {
31
+ throw new InvalidFragmentPropArrayError(componentName, propName);
32
+ }
33
+ const fragmentNode = createFragmentNode(document);
34
+ if (remotePropValue == null) {
35
+ fragmentNode.childNodes = EMPTY_RENDERED_CHILD_NODES;
36
+ }
37
+ else if (typeof remotePropValue === 'string') {
38
+ const text = remotePropValue;
39
+ fragmentNode.text = text;
40
+ fragmentNode.childNodes = [createTextNode(document, text)];
41
+ }
42
+ else if (remotePropValue.kind === KIND_FRAGMENT) {
43
+ convertRemoteChildren(document, fragmentNode, remotePropValue);
44
+ }
45
+ convertedProps[propName] = fragmentNode;
46
+ }
47
+ else {
48
+ convertedProps[propName] = remotePropValue;
49
+ }
50
+ }
51
+ return convertedProps;
52
+ };
53
+ /**
54
+ * Converts a remote child node to a rendered child node.
55
+ *
56
+ * @param document The document to use for creating new nodes.
57
+ * @param remoteChild The remote child node to convert.
58
+ *
59
+ * @returns The rendered child node.
60
+ */
61
+ const convertChildNode = (document, remoteChild) => {
62
+ if (remoteChild.kind === KIND_TEXT) {
63
+ return createTextNode(document, remoteChild);
64
+ }
65
+ else if (remoteChild.kind === KIND_COMPONENT) {
66
+ const name = remoteChild.type;
67
+ const props = convertRemoteProps(document, name, remoteChild.props);
68
+ const elementNode = createElementNode(document, name, props);
69
+ if (!__hubSpotComponentRegistry.isAllowedComponentName(name)) {
70
+ document.addInvalidComponentName(name);
71
+ }
72
+ const { testId } = props;
73
+ if (testId) {
74
+ // If the element has a test ID we will put the element in a lookup map for
75
+ // efficient queries using `findByTestId()`/`maybeFindByTestId()`.
76
+ // First, we need to check if it is already in use and throw an error if it is.
77
+ const existingElement = document.testIdToElementMap.get(testId);
78
+ if (existingElement) {
79
+ throw new DuplicateTestIdError({
80
+ testId,
81
+ previousElement: existingElement,
82
+ newElement: elementNode,
83
+ });
84
+ }
85
+ // If the test ID is not already in use, we can add the element to the lookup map.
86
+ document.testIdToElementMap.set(testId, elementNode);
87
+ }
88
+ convertRemoteChildren(document, elementNode, remoteChild);
89
+ return elementNode;
90
+ }
91
+ else {
92
+ throw new Error(`Illegal State. Unknown remote child. (${JSON.stringify(remoteChild)})`);
93
+ }
94
+ };
95
+ /**
96
+ * Converts the children of a remote parent node to our rendered child nodes.
97
+ * After conversion, the rendered parent node will have its `childNodes` property set
98
+ * to the converted child nodes.
99
+ *
100
+ * @param parentNode The rendered parent node to convert.
101
+ * @param remoteParentNode The remote parent node to convert.
102
+ */
103
+ const convertRemoteChildren = (document, parentNode, remoteParentNode) => {
104
+ const remoteChildren = remoteParentNode.children;
105
+ if (remoteChildren == null) {
106
+ return;
107
+ }
108
+ if (typeof remoteChildren === 'string') {
109
+ const text = remoteChildren;
110
+ parentNode.text = text;
111
+ parentNode.childNodes = [createTextNode(document, text)];
112
+ return;
113
+ }
114
+ let text = null;
115
+ const convertedChildNodes = [];
116
+ let lastRenderedChild;
117
+ for (const remoteChild of remoteChildren) {
118
+ if (remoteChild.kind === KIND_TEXT) {
119
+ const currentChildText = remoteChild.text;
120
+ if (text == null) {
121
+ text = currentChildText;
122
+ }
123
+ else {
124
+ text += currentChildText;
125
+ }
126
+ if (lastRenderedChild && isRenderedTextNode(lastRenderedChild)) {
127
+ // We normalize text nodes by combining consecutive text nodes into a single text node.
128
+ lastRenderedChild.text += remoteChild.text;
129
+ continue;
130
+ }
131
+ }
132
+ const renderedChildNode = convertChildNode(document, remoteChild);
133
+ convertedChildNodes.push(renderedChildNode);
134
+ lastRenderedChild = renderedChildNode;
135
+ }
136
+ parentNode.text = text;
137
+ parentNode.childNodes = convertedChildNodes;
138
+ };
139
+ /**
140
+ * Converts a remote root node to a rendered root node. After conversion, the rendered root node will
141
+ * have its `childNodes` property set to the converted child nodes.
142
+ *
143
+ * @param rootNode The rendered root node to convert.
144
+ * @param remoteRoot The remote root node to convert.
145
+ */
146
+ export const convertRemoteRoot = (rootNode, remoteRoot) => {
147
+ const { document } = rootNode;
148
+ convertRemoteChildren(document, asRenderedParentNode(rootNode), remoteRoot);
149
+ };
@@ -1,8 +1,8 @@
1
- import type { RenderedParentNode } from '../types';
1
+ import { RenderedNode } from '../types.ts';
2
2
  /**
3
3
  * Logs a rendered node tree to the console for debugging purposes.
4
4
  *
5
- * @param parentNode The node to log.
5
+ * @param node The node to log.
6
6
  * @param label Optional label to display before the node tree.
7
7
  */
8
- export declare const debugLog: (parentNode: RenderedParentNode, label?: string) => never;
8
+ export declare const debugLog: (node: RenderedNode, label?: string) => void;
@@ -1,10 +1,18 @@
1
- /* eslint-disable @typescript-eslint/no-unused-vars */
1
+ import { printNode } from "./print.js";
2
2
  /**
3
3
  * Logs a rendered node tree to the console for debugging purposes.
4
4
  *
5
- * @param parentNode The node to log.
5
+ * @param node The node to log.
6
6
  * @param label Optional label to display before the node tree.
7
7
  */
8
- export const debugLog = (parentNode, label) => {
9
- throw new Error('Not implemented');
8
+ export const debugLog = (node, label) => {
9
+ const componentTreeString = printNode(node);
10
+ const separator = ''.padEnd(label?.length ?? 20, '=');
11
+ const logLines = [separator];
12
+ if (label) {
13
+ logLines.push(label);
14
+ }
15
+ logLines.push(componentTreeString);
16
+ logLines.push(separator);
17
+ console.log(logLines.join('\n'));
10
18
  };
@@ -0,0 +1,14 @@
1
+ import type { RenderedDocumentInternal, RenderedRootNodeInternal } from './types-internal.ts';
2
+ export interface CreateDocumentOptions {
3
+ /**
4
+ * A function that can be called to get the latest rendered root node.
5
+ */
6
+ getLatestRootNode: () => RenderedRootNodeInternal;
7
+ }
8
+ /**
9
+ * Creates a rendered document.
10
+ *
11
+ * @param options Options for creating the document.
12
+ * @returns A rendered document.
13
+ */
14
+ export declare const createDocument: (options: CreateDocumentOptions) => RenderedDocumentInternal;
@@ -0,0 +1,40 @@
1
+ import { act as reactAct } from 'react';
2
+ import { InvalidComponentsError } from "./errors.js";
3
+ /**
4
+ * Creates a rendered document.
5
+ *
6
+ * @param options Options for creating the document.
7
+ * @returns A rendered document.
8
+ */
9
+ export const createDocument = (options) => {
10
+ const { getLatestRootNode } = options;
11
+ const invalidComponentNames = new Set();
12
+ // A lookup map of test IDs to elements.
13
+ const testIdToElementMap = new Map();
14
+ const document = {
15
+ rootNode: null,
16
+ testIdToElementMap,
17
+ batchUpdate: (run) => {
18
+ reactAct(run);
19
+ const latestRootNode = getLatestRootNode();
20
+ if (latestRootNode.document.hasInvalidComponentNames()) {
21
+ throw new InvalidComponentsError(latestRootNode);
22
+ }
23
+ },
24
+ addInvalidComponentName: (name) => {
25
+ invalidComponentNames.add(name);
26
+ },
27
+ getInvalidComponentNames: () => {
28
+ if (invalidComponentNames.size === 0) {
29
+ return [];
30
+ }
31
+ const invalidComponentNamesArray = [...invalidComponentNames];
32
+ invalidComponentNamesArray.sort();
33
+ return invalidComponentNamesArray;
34
+ },
35
+ hasInvalidComponentNames: () => {
36
+ return invalidComponentNames.size > 0;
37
+ },
38
+ };
39
+ return document;
40
+ };
@@ -1,5 +1,6 @@
1
- import type { UnknownComponentProps } from '../../../__synced__/types/shared.synced';
2
- import type { RenderedDocumentInternal, RenderedElementNodeInternal } from './types-internal';
1
+ import type { UnknownComponentProps } from '../../../shared/types/shared.ts';
2
+ import { RenderedElementNode } from '../types.ts';
3
+ import type { RenderedDocumentInternal } from './types-internal.ts';
3
4
  /**
4
5
  * Creates a rendered element node.
5
6
  *
@@ -8,4 +9,4 @@ import type { RenderedDocumentInternal, RenderedElementNodeInternal } from './ty
8
9
  * @param props The props of the element.
9
10
  * @returns A rendered element node.
10
11
  */
11
- export declare const createElementNode: (document: RenderedDocumentInternal, name: string, props: UnknownComponentProps) => RenderedElementNodeInternal;
12
+ export declare const createElementNode: (document: RenderedDocumentInternal, name: string, props: UnknownComponentProps) => RenderedElementNode;
@@ -1,9 +1,11 @@
1
- import { RenderedNodeType } from '../types';
2
- import { EMPTY_CHILDREN } from './constants';
3
- import { debugLog } from './debug';
4
- import { InvalidEventFunctionError, MissingEventFunctionError } from './errors';
5
- import { printNode } from './print';
6
- import { find, findAll, findAllChildren, findChild, maybeFind, maybeFindChild, } from './query';
1
+ import { RenderedNodeType } from "../types.js";
2
+ import { isMatch } from "../utils.js";
3
+ import { EMPTY_RENDERED_CHILD_NODES } from "./constants.js";
4
+ import { debugLog } from "./debug.js";
5
+ import { InvalidEventFunctionError, MissingEventFunctionError, } from "./errors.js";
6
+ import { printNode } from "./print.js";
7
+ import { find, findAll, findAllChildren, findChild, maybeFind, maybeFindChild, } from "./query.js";
8
+ import { asRenderedElementNode, asRenderedNode, } from "./type-utils-internal.js";
7
9
  /**
8
10
  * Creates a rendered element node.
9
11
  *
@@ -18,10 +20,10 @@ export const createElementNode = (document, name, props) => {
18
20
  name,
19
21
  props,
20
22
  text: null,
21
- children: EMPTY_CHILDREN,
23
+ childNodes: EMPTY_RENDERED_CHILD_NODES,
22
24
  document,
23
25
  debugLog: (label) => {
24
- debugLog(elementNode, label);
26
+ debugLog(asRenderedNode(elementNode), label);
25
27
  },
26
28
  find: (targetComponent, matcher) => {
27
29
  return find(elementNode, targetComponent, matcher);
@@ -42,7 +44,7 @@ export const createElementNode = (document, name, props) => {
42
44
  return maybeFindChild(elementNode, targetComponent, matcher);
43
45
  },
44
46
  toString: () => {
45
- return printNode(elementNode);
47
+ return printNode(asRenderedNode(elementNode));
46
48
  },
47
49
  trigger: (eventPropName, eventArg) => {
48
50
  const eventFunction = elementNode.props[eventPropName];
@@ -62,6 +64,9 @@ export const createElementNode = (document, name, props) => {
62
64
  eventFunction(eventArg);
63
65
  });
64
66
  },
67
+ isMatch(__component, __matcher) {
68
+ return isMatch(asRenderedNode(elementNode), __component, __matcher);
69
+ },
65
70
  };
66
- return elementNode;
71
+ return asRenderedElementNode(elementNode);
67
72
  };