@wise/dynamic-flow-client 5.8.1 → 5.9.0

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 (420) hide show
  1. package/build/DynamicFlowCore.js +5 -0
  2. package/build/common/errorBoundary/ErrorBoundary.js +26 -0
  3. package/build/common/errorBoundary/ErrorBoundary.test.js +29 -0
  4. package/build/common/errorBoundary/ErrorBoundaryAlert.js +11 -0
  5. package/build/common/makeHttpClient/api-utils.js +3 -0
  6. package/build/common/makeHttpClient/index.js +1 -0
  7. package/build/common/makeHttpClient/makeHttpClient.js +10 -0
  8. package/build/common/makeHttpClient/makeHttpClient.test.js +186 -0
  9. package/build/common/messages/external-confirmation.messages.js +23 -0
  10. package/build/common/messages/file-upload.messages.js +13 -0
  11. package/build/common/messages/generic-error.messages.js +18 -0
  12. package/build/common/messages/help.messages.js +8 -0
  13. package/build/common/messages/multi-file-upload.messages.js +18 -0
  14. package/build/common/messages/multi-select.messages.js +8 -0
  15. package/build/common/messages/paragraph.messages.js +13 -0
  16. package/build/common/messages/repeatable.messages.js +23 -0
  17. package/build/common/messages/search.messages.js +8 -0
  18. package/build/common/messages/validation.array.messages.js +13 -0
  19. package/build/common/messages/validation.messages.js +53 -0
  20. package/build/controller/FlowController.js +368 -0
  21. package/build/controller/executePoll.js +49 -0
  22. package/build/controller/executeRefresh.js +39 -0
  23. package/build/controller/executeRequest.js +77 -0
  24. package/build/controller/executeSubmission.js +69 -0
  25. package/build/controller/getErrorMessage.js +7 -0
  26. package/build/controller/getRequestAbortController.js +13 -0
  27. package/build/controller/getResponseType.js +35 -0
  28. package/build/controller/getSafeHttpClient.js +8 -0
  29. package/build/controller/getStepCounter.js +16 -0
  30. package/build/controller/handleErrorResponse.js +26 -0
  31. package/build/controller/makeSafeHttpClient.js +8 -0
  32. package/build/controller/response-utils.js +72 -0
  33. package/build/domain/components/AlertComponent.js +1 -0
  34. package/build/domain/components/AllOfComponent.js +40 -0
  35. package/build/domain/components/BooleanInputComponent.js +50 -0
  36. package/build/domain/components/BoxComponent.js +3 -0
  37. package/build/domain/components/ButtonComponent.js +1 -0
  38. package/build/domain/components/ColumnsComponent.js +3 -0
  39. package/build/domain/components/ConstComponent.js +18 -0
  40. package/build/domain/components/ContainerComponent.js +3 -0
  41. package/build/domain/components/DateInputComponent.js +75 -0
  42. package/build/domain/components/DecisionComponent.js +1 -0
  43. package/build/domain/components/DividerComponent.js +1 -0
  44. package/build/domain/components/FormComponent.js +3 -0
  45. package/build/domain/components/FormattedValueComponent.js +44 -0
  46. package/build/domain/components/HeadingComponent.js +1 -0
  47. package/build/domain/components/ImageComponent.js +1 -0
  48. package/build/domain/components/InstructionsComponent.js +1 -0
  49. package/build/domain/components/IntegerInputComponent.js +74 -0
  50. package/build/domain/components/ListComponent.js +1 -0
  51. package/build/domain/components/LoadingIndicatorComponent.js +1 -0
  52. package/build/domain/components/MarkdownComponent.js +1 -0
  53. package/build/domain/components/MediaComponent.js +1 -0
  54. package/build/domain/components/ModalComponent.js +16 -0
  55. package/build/domain/components/ModalLayoutComponent.js +3 -0
  56. package/build/domain/components/MoneyInputComponent.js +57 -0
  57. package/build/domain/components/MultiSelectInputComponent.js +81 -0
  58. package/build/domain/components/MultiUploadInputComponent.js +88 -0
  59. package/build/domain/components/NumberInputComponent.js +73 -0
  60. package/build/domain/components/ObjectComponent.js +45 -0
  61. package/build/domain/components/ParagraphComponent.js +1 -0
  62. package/build/domain/components/PersistAsyncComponent.js +92 -0
  63. package/build/domain/components/ProgressComponent.js +1 -0
  64. package/build/domain/components/RepeatableComponent.js +103 -0
  65. package/build/domain/components/ReviewComponent.js +1 -0
  66. package/build/domain/components/RootDomainComponent.js +173 -0
  67. package/build/domain/components/SectionComponent.js +5 -0
  68. package/build/domain/components/SelectInputComponent.js +88 -0
  69. package/build/domain/components/StatusListComponent.js +1 -0
  70. package/build/domain/components/SubflowDomainComponent.js +9 -0
  71. package/build/domain/components/TabsComponent.js +1 -0
  72. package/build/domain/components/TextInputComponent.js +76 -0
  73. package/build/domain/components/TupleComponent.js +41 -0
  74. package/build/domain/components/UploadInputComponent.js +83 -0
  75. package/build/domain/components/UpsellComponent.js +25 -0
  76. package/build/domain/components/searchComponent/SearchComponent.js +92 -0
  77. package/build/domain/components/searchComponent/SearchComponent.test.js +190 -0
  78. package/build/domain/components/step/ExternalConfirmationComponent.js +28 -0
  79. package/build/domain/components/step/StepDomainComponent.js +73 -0
  80. package/build/domain/components/step/ToolbarComponent.js +1 -0
  81. package/build/domain/components/utils/WithUpdate.js +1 -0
  82. package/build/domain/components/utils/component-utils.js +12 -0
  83. package/build/domain/components/utils/debounce.js +34 -0
  84. package/build/domain/components/utils/debounce.test.js +67 -0
  85. package/build/domain/components/utils/file-utils.js +21 -0
  86. package/build/domain/components/utils/file-utils.test.js +27 -0
  87. package/build/domain/components/utils/getRandomId.js +1 -0
  88. package/build/domain/components/utils/isExactLocalValueMatch.js +14 -0
  89. package/build/domain/components/utils/isOrWasValid.js +5 -0
  90. package/build/domain/components/utils/isPartialModelMatch.js +18 -0
  91. package/build/domain/components/utils/isPartialModelMatch.test.js +74 -0
  92. package/build/domain/features/eventNames.js +24 -0
  93. package/build/domain/features/events.js +1 -0
  94. package/build/domain/features/persistAsync/getComponentMultiPersistAsync.js +50 -0
  95. package/build/domain/features/persistAsync/getInitialPersistedState.js +7 -0
  96. package/build/domain/features/persistAsync/getPerformPersistAsync.js +43 -0
  97. package/build/domain/features/persistAsync/getPerformPersistAsync.test.js +139 -0
  98. package/build/domain/features/polling/getStepPolling.js +43 -0
  99. package/build/domain/features/polling/getStepPolling.test.js +90 -0
  100. package/build/domain/features/prefetch/getStepPrefetch.js +43 -0
  101. package/build/domain/features/prefetch/request-cache.js +49 -0
  102. package/build/domain/features/prefetch/request-cache.test.js +70 -0
  103. package/build/domain/features/refreshAfter/getStepRefreshAfter.js +24 -0
  104. package/build/domain/features/refreshAfter/getStepRefreshAfter.test.js +40 -0
  105. package/build/domain/features/schema-on-change/getDebouncedSchemaOnChange.js +50 -0
  106. package/build/domain/features/schema-on-change/getSchemaOnChange.js +34 -0
  107. package/build/domain/features/search/getPerformSearchFunction.js +75 -0
  108. package/build/domain/features/search/getPerformSearchFunction.test.js +301 -0
  109. package/build/domain/features/summary/summary-utils.js +40 -0
  110. package/build/domain/features/summary/summary-utils.test.js +125 -0
  111. package/build/domain/features/utils/http-utils.js +21 -0
  112. package/build/domain/features/utils/response-utils.js +9 -0
  113. package/build/domain/features/validation/spec-utils.js +19 -0
  114. package/build/domain/features/validation/validateStringPattern.js +24 -0
  115. package/build/domain/features/validation/validation-functions.js +6 -0
  116. package/build/domain/features/validation/validation-functions.test.js +108 -0
  117. package/build/domain/features/validation/value-checks.js +125 -0
  118. package/build/domain/features/validation/value-checks.test.js +262 -0
  119. package/build/domain/features/validationAsync/getComponentValidationAsync.js +53 -0
  120. package/build/domain/features/validationAsync/getComponentValidationAsync.test.js +67 -0
  121. package/build/domain/features/validationAsync/getInitialValidationAsyncState.js +5 -0
  122. package/build/domain/features/validationAsync/getPerformValidationAsync.js +45 -0
  123. package/build/domain/features/validationAsync/getPerformValidationAsync.test.js +143 -0
  124. package/build/domain/mappers/layout/alertLayoutToComponent.js +16 -0
  125. package/build/domain/mappers/layout/boxLayoutToComponent.js +13 -0
  126. package/build/domain/mappers/layout/buttonLayoutToComponent.js +77 -0
  127. package/build/domain/mappers/layout/columnsLayoutToComponent.js +13 -0
  128. package/build/domain/mappers/layout/decisionLayoutToComponent.js +22 -0
  129. package/build/domain/mappers/layout/deprecatedListLayoutToComponent.js +30 -0
  130. package/build/domain/mappers/layout/dividerLayoutToComponent.js +2 -0
  131. package/build/domain/mappers/layout/formLayoutToComponent.js +19 -0
  132. package/build/domain/mappers/layout/headingLayoutToComponent.js +12 -0
  133. package/build/domain/mappers/layout/imageLayoutToComponent.js +20 -0
  134. package/build/domain/mappers/layout/infoLayoutToComponent.js +12 -0
  135. package/build/domain/mappers/layout/instructionsLayoutToComponent.js +12 -0
  136. package/build/domain/mappers/layout/listLayoutToComponent.js +39 -0
  137. package/build/domain/mappers/layout/loadingIndicatorLayoutToComponent.js +9 -0
  138. package/build/domain/mappers/layout/markdownLayoutToComponent.js +12 -0
  139. package/build/domain/mappers/layout/mediaLayoutToComponent.js +12 -0
  140. package/build/domain/mappers/layout/modalLayoutToComponent.js +17 -0
  141. package/build/domain/mappers/layout/modalToComponent.js +8 -0
  142. package/build/domain/mappers/layout/paragraphLayoutToComponent.js +12 -0
  143. package/build/domain/mappers/layout/progressLayoutToComponent.js +15 -0
  144. package/build/domain/mappers/layout/reviewLayoutToComponent.js +48 -0
  145. package/build/domain/mappers/layout/searchLayoutToComponent.js +44 -0
  146. package/build/domain/mappers/layout/sectionLayoutToComponent.js +15 -0
  147. package/build/domain/mappers/layout/statusListLayoutToComponent.js +15 -0
  148. package/build/domain/mappers/layout/tabsLayoutToComponent.js +16 -0
  149. package/build/domain/mappers/layout/upsellLayoutToComponent.js +25 -0
  150. package/build/domain/mappers/mapLayoutToComponent.js +81 -0
  151. package/build/domain/mappers/mapSchemaToComponent.js +61 -0
  152. package/build/domain/mappers/mapSchemaToComponent.test.js +112 -0
  153. package/build/domain/mappers/mapStepSchemas.js +17 -0
  154. package/build/domain/mappers/mapStepToComponent.js +132 -0
  155. package/build/domain/mappers/mapStepToComponent.test.js +221 -0
  156. package/build/domain/mappers/mapToolbarToComponent.js +15 -0
  157. package/build/domain/mappers/schema/allOfSchemaToComponent.js +16 -0
  158. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToComponent.js +26 -0
  159. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToMultiSelectComponent.js +55 -0
  160. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToMultiUploadComponent.js +67 -0
  161. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToRepeatableComponent.js +57 -0
  162. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToTupleComponent.js +20 -0
  163. package/build/domain/mappers/schema/blobSchemaToComponent.js +15 -0
  164. package/build/domain/mappers/schema/booleanSchemaToComponent.js +29 -0
  165. package/build/domain/mappers/schema/constSchemaToComponent.js +23 -0
  166. package/build/domain/mappers/schema/integerSchemaToComponent.js +28 -0
  167. package/build/domain/mappers/schema/numberSchemaToComponent.js +26 -0
  168. package/build/domain/mappers/schema/objectSchemaToComponent/assertDisplayOrder.js +23 -0
  169. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToFormattedValueComponent.js +9 -0
  170. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToMoneyInputComponent.js +119 -0
  171. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToMoneyInputComponent.test.js +96 -0
  172. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToObjectComponent.js +31 -0
  173. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToObjectComponent.test.js +99 -0
  174. package/build/domain/mappers/schema/oneOfSchemaToComponent/oneOfSchemaToComponent.js +76 -0
  175. package/build/domain/mappers/schema/oneOfSchemaToComponent/oneOfSchemaToComponent.test.js +265 -0
  176. package/build/domain/mappers/schema/persistAsyncSchemaToComponent.js +29 -0
  177. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToComponent.js +18 -0
  178. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToComponent.test.js +133 -0
  179. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToDateInputComponent.js +48 -0
  180. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToTextInputComponent.js +37 -0
  181. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToUploadInputComponent.js +28 -0
  182. package/build/domain/mappers/schema/tests/test-utils.js +16 -0
  183. package/build/domain/mappers/schema/types.js +1 -0
  184. package/build/domain/mappers/schema/utils/getPerformPersistAsyncFn.js +19 -0
  185. package/build/domain/mappers/schema/utils/getValidationAsyncInitialState.js +23 -0
  186. package/build/domain/mappers/schema/utils/mapCommonSchemaProps.js +16 -0
  187. package/build/domain/mappers/types.js +1 -0
  188. package/build/domain/mappers/utils/FeatureFlags.js +22 -0
  189. package/build/domain/mappers/utils/behavior-utils.js +44 -0
  190. package/build/domain/mappers/utils/call-to-action-utils.js +21 -0
  191. package/build/domain/mappers/utils/getAutocompleteString.js +76 -0
  192. package/build/domain/mappers/utils/getAutocompleteString.test.js +21 -0
  193. package/build/domain/mappers/utils/groupLayoutByPinned.js +38 -0
  194. package/build/domain/mappers/utils/groupLayoutByPinned.test.js +166 -0
  195. package/build/domain/mappers/utils/image.js +9 -0
  196. package/build/domain/mappers/utils/layout-utils.js +11 -0
  197. package/build/domain/mappers/utils/legacy-utils.js +49 -0
  198. package/build/domain/mappers/utils/media-utils.js +14 -0
  199. package/build/domain/mappers/utils/suggestions-utils.js +26 -0
  200. package/build/domain/mappers/utils/suggestions-utils.test.js +36 -0
  201. package/build/domain/mappers/utils/tags-utils.js +1 -0
  202. package/build/domain/mappers/utils/utils.js +35 -0
  203. package/build/domain/types.js +1 -0
  204. package/build/getSubflowCallbacks.js +38 -0
  205. package/build/i18n/index.js +40 -0
  206. package/build/index.js +8 -0
  207. package/build/main.js +112 -54
  208. package/build/main.mjs +111 -53
  209. package/build/renderers/CoreContainerRenderer.js +5 -0
  210. package/build/renderers/CoreRootRenderer.js +12 -0
  211. package/build/renderers/EmptyLoadingStateRenderer.js +5 -0
  212. package/build/renderers/getRenderFunction.js +24 -0
  213. package/build/renderers/getSchemaErrorMessageFunction.js +97 -0
  214. package/build/renderers/mappers/alertComponentToProps.js +2 -0
  215. package/build/renderers/mappers/allOfComponentToProps.js +6 -0
  216. package/build/renderers/mappers/booleanInputComponentToProps.js +5 -0
  217. package/build/renderers/mappers/boxComponentToProps.js +13 -0
  218. package/build/renderers/mappers/buttonComponentToProps.js +4 -0
  219. package/build/renderers/mappers/columnsComponentToProps.js +11 -0
  220. package/build/renderers/mappers/componentToRendererProps.js +164 -0
  221. package/build/renderers/mappers/constComponentToProps.js +5 -0
  222. package/build/renderers/mappers/containerComponentToProps.js +7 -0
  223. package/build/renderers/mappers/dateInputComponentToProps.js +2 -0
  224. package/build/renderers/mappers/decisionComponentToProps.js +16 -0
  225. package/build/renderers/mappers/dividerComponentToProps.js +2 -0
  226. package/build/renderers/mappers/externalComponentToProps.js +3 -0
  227. package/build/renderers/mappers/formComponentToProps.js +12 -0
  228. package/build/renderers/mappers/formattedValueComponentToProps.js +5 -0
  229. package/build/renderers/mappers/headingComponentToProps.js +2 -0
  230. package/build/renderers/mappers/hiddenComponentToProps.js +4 -0
  231. package/build/renderers/mappers/imageComponentToProps.js +2 -0
  232. package/build/renderers/mappers/instructionsComponentToProps.js +2 -0
  233. package/build/renderers/mappers/integerInputComponentToProps.js +2 -0
  234. package/build/renderers/mappers/listComponentToProps.js +2 -0
  235. package/build/renderers/mappers/loadingIndicatorComponentToProps.js +2 -0
  236. package/build/renderers/mappers/markdownComponentToProps.js +2 -0
  237. package/build/renderers/mappers/mediaComponentToProps.js +2 -0
  238. package/build/renderers/mappers/modalComponentToProps.js +11 -0
  239. package/build/renderers/mappers/modalLayoutComponentToProps.js +16 -0
  240. package/build/renderers/mappers/moneyInputComponentToProps.js +36 -0
  241. package/build/renderers/mappers/multiSelectComponentToProps.js +23 -0
  242. package/build/renderers/mappers/multiUploadInputComponentToProps.js +12 -0
  243. package/build/renderers/mappers/numberInputComponentToProps.js +2 -0
  244. package/build/renderers/mappers/objectComponentToProps.js +8 -0
  245. package/build/renderers/mappers/paragraphComponentToProps.js +2 -0
  246. package/build/renderers/mappers/persistAsyncComponentToProps.js +8 -0
  247. package/build/renderers/mappers/progressComponentToProps.js +2 -0
  248. package/build/renderers/mappers/repeatableComponentToProps.js +30 -0
  249. package/build/renderers/mappers/reviewComponentToProps.js +2 -0
  250. package/build/renderers/mappers/rootComponentToProps.js +21 -0
  251. package/build/renderers/mappers/searchComponentToProps.js +57 -0
  252. package/build/renderers/mappers/sectionComponentToProps.js +6 -0
  253. package/build/renderers/mappers/selectInputComponentToProps.js +26 -0
  254. package/build/renderers/mappers/statusListComponentToProps.js +2 -0
  255. package/build/renderers/mappers/subflowComponentToRendererProps.js +4 -0
  256. package/build/renderers/mappers/tabsComponentToProps.js +14 -0
  257. package/build/renderers/mappers/textInputComponentToProps.js +2 -0
  258. package/build/renderers/mappers/tupleComponentToProps.js +8 -0
  259. package/build/renderers/mappers/uploadInputComponentToProps.js +8 -0
  260. package/build/renderers/mappers/upsellComponentToProps.js +2 -0
  261. package/build/renderers/mappers/utils/getValidationState.js +12 -0
  262. package/build/renderers/mappers/utils/inputComponentToProps.js +26 -0
  263. package/build/renderers/mappers/utils/mapErrorsToValidationState.js +9 -0
  264. package/build/renderers/mappers/utils/pick.js +8 -0
  265. package/build/renderers/mappers/utils/selectInputOptionsToProps.js +11 -0
  266. package/build/renderers/stepComponentToProps.js +32 -0
  267. package/build/renderers/utils.js +69 -0
  268. package/build/renderers/utils.test.js +70 -0
  269. package/build/stories/dev-tools/ContainerQueries.story.js +66 -0
  270. package/build/stories/dev-tools/Debugger.story.js +38 -0
  271. package/build/stories/dev-tools/FixtureSelect.story.js +23 -0
  272. package/build/stories/dev-tools/TestServer.story.js +32 -0
  273. package/build/stories/examples/NativeFlow.story.js +80 -0
  274. package/build/stories/examples/Recipients.story.js +568 -0
  275. package/build/stories/spec/behavior/Copy.story.js +59 -0
  276. package/build/stories/spec/behavior/Modal.story.js +76 -0
  277. package/build/stories/spec/behavior/Subflow.story.js +267 -0
  278. package/build/stories/spec/layouts/Decision.story.js +241 -0
  279. package/build/stories/spec/layouts/Image.story.js +42 -0
  280. package/build/stories/spec/layouts/Modal.story.js +81 -0
  281. package/build/stories/spec/layouts/Search.story.js +325 -0
  282. package/build/stories/spec/layouts/Upsell.story.js +55 -0
  283. package/build/stories/spec/layouts/button/Button.story.js +100 -0
  284. package/build/stories/spec/layouts/button/PinnedButton.story.js +81 -0
  285. package/build/stories/spec/response/ActionResponse.story.js +66 -0
  286. package/build/stories/spec/schemas/MultiSelect.story.js +148 -0
  287. package/build/stories/spec/schemas/Upload.story.js +168 -0
  288. package/build/stories/spec/schemas/const/ConstLayout.story.js +159 -0
  289. package/build/stories/spec/schemas/const/ObjectConst.story.js +94 -0
  290. package/build/stories/spec/schemas/features/PersistAsync.story.js +176 -0
  291. package/build/stories/spec/schemas/features/ValidationAsync.story.js +103 -0
  292. package/build/stories/spec/schemas/object/FormattedValue.story.js +92 -0
  293. package/build/stories/spec/schemas/object/MoneyInput.story.js +240 -0
  294. package/build/stories/spec/schemas/oneOf/OneOfInitialisation.story.js +55 -0
  295. package/build/stories/spec/step/Controls.story.js +109 -0
  296. package/build/stories/spec/step/DFModal.story.js +58 -0
  297. package/build/stories/spec/step/Footer.story.js +70 -0
  298. package/build/stories/spec/step/Navigation.story.js +20 -0
  299. package/build/stories/spec/step/Tags.story.js +39 -0
  300. package/build/stories/spec/step/ToolBar.story.js +60 -0
  301. package/build/stories/spec/step/features/ErrorHandling.story.js +92 -0
  302. package/build/stories/spec/step/features/External.story.js +44 -0
  303. package/build/stories/spec/step/features/Polling.story.js +108 -0
  304. package/build/stories/spec/step/features/RefreshAfter.story.js +92 -0
  305. package/build/stories/spec/step/features/refresh/Refresh.story.js +258 -0
  306. package/build/stories/spec/step/features/refresh/RefreshWithPersistAsync.story.js +958 -0
  307. package/build/stories/types.js +1 -0
  308. package/build/stories/utils/fixtureHttpClient.js +70 -0
  309. package/build/stories/utils/getBasicStep.js +223 -0
  310. package/build/stories/utils/mockSearchHandler.js +71 -0
  311. package/build/stories/utils/render-utils.js +41 -0
  312. package/build/stories/visual-tests/layouts/NotUsingListItem.story.js +17 -0
  313. package/build/test-utils/DynamicFlowWise.js +32 -0
  314. package/build/test-utils/DynamicFlowWiseModal.js +34 -0
  315. package/build/test-utils/NeptuneProviders.js +11 -0
  316. package/build/test-utils/component-utils.js +5 -0
  317. package/build/test-utils/fetch-utils.js +45 -0
  318. package/build/test-utils/getMergedTestRenderers.js +34 -0
  319. package/build/test-utils/getRandomId.js +1 -0
  320. package/build/test-utils/index.js +3 -0
  321. package/build/test-utils/rtl-utils.js +7 -0
  322. package/build/test-utils/step-utils.js +6 -0
  323. package/build/test-utils/wait.js +3 -0
  324. package/build/tests/AlertLayout.test.js +78 -0
  325. package/build/tests/ArrayTuple.test.js +118 -0
  326. package/build/tests/ButtonLayout.test.js +308 -0
  327. package/build/tests/ConstLayout.test.js +95 -0
  328. package/build/tests/DateInput.test.js +163 -0
  329. package/build/tests/DecisionLayout.test.js +146 -0
  330. package/build/tests/DynamicFlow.test.js +147 -0
  331. package/build/tests/External.test.js +169 -0
  332. package/build/tests/Flow.test.js +328 -0
  333. package/build/tests/FormLayout.test.js +28 -0
  334. package/build/tests/FormattedValue.test.js +107 -0
  335. package/build/tests/ImageRenderer.test.js +78 -0
  336. package/build/tests/InitialAction.test.js +179 -0
  337. package/build/tests/InitialStep.test.js +168 -0
  338. package/build/tests/InstructionsLayout.test.js +45 -0
  339. package/build/tests/ListLayout.test.js +145 -0
  340. package/build/tests/Logging.test.js +53 -0
  341. package/build/tests/ModalBehavior.test.js +149 -0
  342. package/build/tests/MoneyInput.test.js +316 -0
  343. package/build/tests/MultiUpload.test.js +293 -0
  344. package/build/tests/NativeBack.test.js +267 -0
  345. package/build/tests/OneOfInitialisation.test.js +571 -0
  346. package/build/tests/PersistAsync.test.js +653 -0
  347. package/build/tests/Polling.test.js +617 -0
  348. package/build/tests/Prefetching.test.js +230 -0
  349. package/build/tests/RefreshAfter.test.js +63 -0
  350. package/build/tests/RefreshOnChange.ResponseHandling.test.js +205 -0
  351. package/build/tests/RefreshOnChange.test.js +233 -0
  352. package/build/tests/RefreshOnChange.with.Segmented.test.js +348 -0
  353. package/build/tests/RefreshOnChange.with.Tabs.test.js +358 -0
  354. package/build/tests/RefreshOnChangePreserve.test.js +224 -0
  355. package/build/tests/RendererProps.test.js +342 -0
  356. package/build/tests/Repeatable.test.js +107 -0
  357. package/build/tests/Rerendering.test.js +67 -0
  358. package/build/tests/ReviewLayout.test.js +274 -0
  359. package/build/tests/SchemaOnChange.test.js +133 -0
  360. package/build/tests/ScrollToError.test.js +217 -0
  361. package/build/tests/SegmentedControl.test.js +49 -0
  362. package/build/tests/SingleFileUpload.test.js +88 -0
  363. package/build/tests/StatusList.test.js +85 -0
  364. package/build/tests/Subflow.test.js +710 -0
  365. package/build/tests/Submission.ResponseHandling.test.js +557 -0
  366. package/build/tests/Submission.merging.test.js +202 -0
  367. package/build/tests/Submission.test.js +523 -0
  368. package/build/tests/Tags.test.js +475 -0
  369. package/build/tests/Upsell.test.js +126 -0
  370. package/build/tests/ValidationAsync.test.js +295 -0
  371. package/build/tests/legacy/Actions.test.js +158 -0
  372. package/build/tests/legacy/BackButton.test.js +114 -0
  373. package/build/tests/legacy/HiddenSchemas.test.js +246 -0
  374. package/build/tests/legacy/MultiSelect.test.js +497 -0
  375. package/build/tests/legacy/MultipleFileUploadSchema.test.js +341 -0
  376. package/build/tests/legacy/PersistAsync.blob-schema.test.js +224 -0
  377. package/build/tests/legacy/PersistAsync.string-schema.test.js +211 -0
  378. package/build/tests/legacy/RefreshStepOnChange.debouncing.test.js +209 -0
  379. package/build/tests/legacy/RefreshStepOnChange.test.js +424 -0
  380. package/build/tests/legacy/Search.test.js +437 -0
  381. package/build/tests/renderers/MultiSelectInputRendererProps.test.js +58 -0
  382. package/build/tests/renderers/SelectInputRendererProps.test.js +42 -0
  383. package/build/tests/renderers/TextInputRenderer.test.js +51 -0
  384. package/build/types/domain/components/UpsellComponent.d.ts +2 -3
  385. package/build/types/domain/components/UpsellComponent.d.ts.map +1 -1
  386. package/build/types/domain/components/searchComponent/SearchComponent.d.ts +5 -4
  387. package/build/types/domain/components/searchComponent/SearchComponent.d.ts.map +1 -1
  388. package/build/types/domain/features/search/getPerformSearchFunction.d.ts +1 -1
  389. package/build/types/domain/features/search/getPerformSearchFunction.d.ts.map +1 -1
  390. package/build/types/domain/mappers/layout/searchLayoutToComponent.d.ts +2 -1
  391. package/build/types/domain/mappers/layout/searchLayoutToComponent.d.ts.map +1 -1
  392. package/build/types/domain/mappers/layout/upsellLayoutToComponent.d.ts +1 -1
  393. package/build/types/domain/mappers/layout/upsellLayoutToComponent.d.ts.map +1 -1
  394. package/build/types/renderers/EmptyLoadingStateRenderer.d.ts +3 -0
  395. package/build/types/renderers/EmptyLoadingStateRenderer.d.ts.map +1 -0
  396. package/build/types/renderers/mappers/rootComponentToProps.d.ts.map +1 -1
  397. package/build/types/renderers/mappers/searchComponentToProps.d.ts +1 -1
  398. package/build/types/renderers/mappers/searchComponentToProps.d.ts.map +1 -1
  399. package/build/types/renderers/mappers/upsellComponentToProps.d.ts +2 -2
  400. package/build/types/renderers/mappers/upsellComponentToProps.d.ts.map +1 -1
  401. package/build/types/test-utils/getMergedTestRenderers.d.ts +1 -1
  402. package/build/types/test-utils/getMergedTestRenderers.d.ts.map +1 -1
  403. package/build/types/useDynamicFlow.d.ts.map +1 -1
  404. package/build/types.js +1 -0
  405. package/build/useDynamicFlow.js +104 -0
  406. package/build/useDynamicFlowModal.js +58 -0
  407. package/build/utils/analyse-step.js +14 -0
  408. package/build/utils/component-utils.js +8 -0
  409. package/build/utils/component-utils.test.js +113 -0
  410. package/build/utils/getScrollToTop.js +12 -0
  411. package/build/utils/normalise-flow-id.js +1 -0
  412. package/build/utils/normalise-flow-id.test.js +24 -0
  413. package/build/utils/openLinkInNewTab.js +10 -0
  414. package/build/utils/recursiveMerge.js +40 -0
  415. package/build/utils/recursiveMerge.test.js +93 -0
  416. package/build/utils/type-utils.js +21 -0
  417. package/build/utils/type-validators.js +11 -0
  418. package/build/utils/type-validators.test.js +180 -0
  419. package/build/utils/useStableCallback.js +15 -0
  420. package/package.json +4 -4
package/build/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { makeHttpClient } from './common/makeHttpClient';
2
+ export { default as translations } from './i18n';
3
+ export { findRendererPropsByType } from './renderers/utils';
4
+ export { useDynamicFlow } from './useDynamicFlow';
5
+ export { useDynamicFlowModal } from './useDynamicFlowModal';
6
+ export { DynamicFlowCore as DynamicFlow } from './DynamicFlowCore';
7
+ export { makeRequestCache } from './domain/features/prefetch/request-cache';
8
+ export { eventNames } from './domain/features/eventNames';
package/build/main.js CHANGED
@@ -836,6 +836,7 @@ var getChildren = (node) => {
836
836
  case "heading":
837
837
  case "hidden":
838
838
  case "image":
839
+ case "loading-state":
839
840
  case "instructions":
840
841
  case "input-integer":
841
842
  case "list":
@@ -2091,7 +2092,7 @@ var debounce = (callback, waitMs) => {
2091
2092
  // src/domain/components/searchComponent/SearchComponent.ts
2092
2093
  var DEBOUNCE_TIME = 400;
2093
2094
  var createSearchComponent = (searchProps, performSearch, onBehavior, onComponentUpdate) => {
2094
- const { uid, analyticsId, control, emptyMessage, hint, margin, tags, title } = searchProps;
2095
+ const { uid, analyticsId, control, emptyMessage, initialState, hint, margin, tags, title } = searchProps;
2095
2096
  const update = getInputUpdateFunction(onComponentUpdate);
2096
2097
  let abortController = new AbortController();
2097
2098
  const search = (component2, query, searchConfig) => {
@@ -2105,7 +2106,7 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2105
2106
  }).then((state) => {
2106
2107
  if (!signal.aborted) {
2107
2108
  update(component2, (draft) => {
2108
- draft.state = state;
2109
+ draft.state = state != null ? state : initialState;
2109
2110
  draft.isLoading = false;
2110
2111
  draft.error = void 0;
2111
2112
  });
@@ -2127,9 +2128,10 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2127
2128
  analyticsId,
2128
2129
  control,
2129
2130
  emptyMessage,
2131
+ initialState,
2130
2132
  hint,
2131
2133
  margin,
2132
- state: null,
2134
+ state: initialState,
2133
2135
  tags,
2134
2136
  title,
2135
2137
  isLoading: false,
@@ -2138,11 +2140,22 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2138
2140
  update(this, updateFn);
2139
2141
  },
2140
2142
  onChange(query) {
2141
- this._update((draft) => {
2142
- draft.query = query;
2143
- draft.isLoading = true;
2144
- });
2145
- debouncedSearch(this, query.trim());
2143
+ if (query.trim()) {
2144
+ this._update((draft) => {
2145
+ draft.query = query;
2146
+ draft.isLoading = true;
2147
+ });
2148
+ debouncedSearch(this, query.trim());
2149
+ } else {
2150
+ abortController.abort();
2151
+ debouncedSearch.cancel();
2152
+ update(component, (draft) => {
2153
+ draft.query = query;
2154
+ draft.state = initialState;
2155
+ draft.isLoading = false;
2156
+ draft.error = void 0;
2157
+ });
2158
+ }
2146
2159
  },
2147
2160
  onSelect({ type, value }) {
2148
2161
  if (type === "action") {
@@ -2238,11 +2251,23 @@ var isValidResponseBody = (body) => {
2238
2251
  var hashRequest = (query, config) => JSON.stringify({ query, config });
2239
2252
 
2240
2253
  // src/domain/mappers/layout/searchLayoutToComponent.ts
2241
- var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint, method, param, title, url, margin, tags }, mapperProps) => {
2254
+ var searchLayoutToComponent = (uid, {
2255
+ analyticsId,
2256
+ control,
2257
+ emptyMessage = "",
2258
+ initialState,
2259
+ hint,
2260
+ method,
2261
+ param,
2262
+ title,
2263
+ url,
2264
+ margin,
2265
+ tags
2266
+ }, mapperProps) => {
2242
2267
  const { httpClient, onBehavior, onComponentUpdate } = mapperProps;
2243
2268
  const search = getPerformSearchFunction(
2244
2269
  httpClient,
2245
- (layout) => mapLayoutToComponent(`${uid}-search-response`, layout, mapperProps, []),
2270
+ (layout, index) => mapLayoutToComponent(`${uid}-search-response-${index}`, layout, mapperProps, []),
2246
2271
  { method, param, url }
2247
2272
  );
2248
2273
  return createSearchComponent(
@@ -2250,7 +2275,8 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2250
2275
  uid,
2251
2276
  analyticsId,
2252
2277
  control,
2253
- emptyMessage: emptyMessage != null ? emptyMessage : "",
2278
+ emptyMessage,
2279
+ initialState: getInitialState(uid, initialState, mapperProps),
2254
2280
  hint,
2255
2281
  margin: margin != null ? margin : "md",
2256
2282
  tags,
@@ -2261,6 +2287,33 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2261
2287
  onComponentUpdate
2262
2288
  );
2263
2289
  };
2290
+ var getInitialState = (uid, initialState, mapperProps) => {
2291
+ if (!initialState) {
2292
+ return emptyInitialState;
2293
+ }
2294
+ switch (initialState.type) {
2295
+ case "layout":
2296
+ return {
2297
+ type: "layout",
2298
+ content: initialState.content.map(
2299
+ (layout, index) => mapLayoutToComponent(`${uid}-initial-${index}`, layout, mapperProps, [])
2300
+ )
2301
+ };
2302
+ case "results":
2303
+ return {
2304
+ type: "results",
2305
+ results: initialState.results
2306
+ };
2307
+ default: {
2308
+ const exhaustiveCheck = initialState;
2309
+ return emptyInitialState;
2310
+ }
2311
+ }
2312
+ };
2313
+ var emptyInitialState = {
2314
+ type: "layout",
2315
+ content: []
2316
+ };
2264
2317
 
2265
2318
  // src/domain/components/SectionComponent.ts
2266
2319
  var createSectionComponent = (props) => {
@@ -2351,24 +2404,13 @@ var createUpsellComponent = (upsellProps, onComponentUpdate) => {
2351
2404
  };
2352
2405
 
2353
2406
  // src/domain/mappers/layout/upsellLayoutToComponent.ts
2354
- var upsellLayoutToComponent = (uid, {
2355
- analyticsId,
2356
- callToAction,
2357
- context,
2358
- control,
2359
- margin,
2360
- media,
2361
- onDismiss,
2362
- tags,
2363
- text
2364
- }, mapperProps) => {
2407
+ var upsellLayoutToComponent = (uid, { analyticsId, callToAction, control, margin, media, onDismiss, tags, text }, mapperProps) => {
2365
2408
  const { onComponentUpdate } = mapperProps;
2366
2409
  return createUpsellComponent(
2367
2410
  {
2368
2411
  uid,
2369
2412
  analyticsId,
2370
2413
  callToAction: getDomainLayerCallToAction(callToAction, mapperProps),
2371
- context: context ? mapLegacyContext(context) : "neutral",
2372
2414
  control,
2373
2415
  margin: margin != null ? margin : "md",
2374
2416
  media: getDomainLayerMedia({ media }),
@@ -6983,16 +7025,23 @@ var CoreContainerRenderer = {
6983
7025
  render: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children })
6984
7026
  };
6985
7027
 
6986
- // src/renderers/CoreRootRenderer.tsx
7028
+ // src/renderers/EmptyLoadingStateRenderer.tsx
6987
7029
  var import_jsx_runtime4 = require("react/jsx-runtime");
7030
+ var EmptyLoadingStateRenderer = {
7031
+ canRenderType: "loading-state",
7032
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, {})
7033
+ };
7034
+
7035
+ // src/renderers/CoreRootRenderer.tsx
7036
+ var import_jsx_runtime5 = require("react/jsx-runtime");
6988
7037
  var CoreRootRenderer = {
6989
7038
  canRenderType: "root",
6990
7039
  render: ({ children, childrenProps, subflow }) => {
6991
7040
  if ((subflow == null ? void 0 : subflow.presentation.type) === "push") {
6992
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children: subflow.children });
7041
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, { children: subflow.children });
6993
7042
  }
6994
7043
  const [stepProps] = findRendererPropsByType(childrenProps, "step");
6995
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { id: stepProps == null ? void 0 : stepProps.id, className: "dynamic-flow-step", children: [
7044
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { id: stepProps == null ? void 0 : stepProps.id, className: "dynamic-flow-step", children: [
6996
7045
  children,
6997
7046
  (subflow == null ? void 0 : subflow.presentation.type) === "modal" ? subflow.children : void 0
6998
7047
  ] });
@@ -7000,7 +7049,7 @@ var CoreRootRenderer = {
7000
7049
  };
7001
7050
 
7002
7051
  // src/renderers/getRenderFunction.tsx
7003
- var import_jsx_runtime5 = require("react/jsx-runtime");
7052
+ var import_jsx_runtime6 = require("react/jsx-runtime");
7004
7053
  var getRenderFunction = (renderers) => {
7005
7054
  function ComponentRenderer(props) {
7006
7055
  const { type } = props;
@@ -7020,9 +7069,9 @@ var getRenderFunction = (renderers) => {
7020
7069
  }
7021
7070
  const render = (props) => {
7022
7071
  if (!props) {
7023
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, {});
7072
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, {});
7024
7073
  }
7025
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ComponentRenderer, __spreadValues({}, props), props.uid);
7074
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ComponentRenderer, __spreadValues({}, props), props.uid);
7026
7075
  };
7027
7076
  return render;
7028
7077
  };
@@ -7919,14 +7968,17 @@ var getToolbarProps = (toolbar, rendererMapperProps) => {
7919
7968
 
7920
7969
  // src/renderers/mappers/rootComponentToProps.ts
7921
7970
  var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7922
- const childrenProps = rootComponent.getChildren().map((child) => {
7923
- if (child.type === "step") {
7924
- return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7925
- showBack: rootComponent.canPerformBack()
7926
- }));
7927
- }
7928
- return componentToRendererProps(child, rendererMapperProps);
7929
- });
7971
+ const childrenProps = [
7972
+ __spreadValues({ type: "loading-state", uid: "loading-state" }, rendererMapperProps),
7973
+ ...rootComponent.getChildren().map((child) => {
7974
+ if (child.type === "step") {
7975
+ return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7976
+ showBack: rootComponent.canPerformBack()
7977
+ }));
7978
+ }
7979
+ return componentToRendererProps(child, rendererMapperProps);
7980
+ })
7981
+ ];
7930
7982
  const subflow = rootComponent.subflow ? {
7931
7983
  presentation: rootComponent.subflow.presentation,
7932
7984
  children: rendererMapperProps.render(
@@ -7982,7 +8034,7 @@ var getSearchState = ({
7982
8034
  onChange,
7983
8035
  onSelect
7984
8036
  }) => {
7985
- if (!query || isLoading) {
8037
+ if (isLoading) {
7986
8038
  return { type: "pending" };
7987
8039
  }
7988
8040
  if (error) {
@@ -8002,19 +8054,21 @@ var getSearchState = ({
8002
8054
  layoutProps
8003
8055
  };
8004
8056
  }
8005
- if (state.results.length === 0) {
8057
+ if (query && state.results.length === 0) {
8006
8058
  return { type: "noResults", message: emptyMessage };
8007
8059
  }
8008
- const rendererResults = state.results.map((result) => {
8009
- var _a;
8010
- return __spreadProps(__spreadValues({}, result), {
8011
- id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
8012
- image: mapSpecImage(result.image),
8013
- media: getDomainLayerMedia(result),
8014
- onClick: () => onSelect(result)
8015
- });
8016
- });
8017
- return { type: "results", results: rendererResults };
8060
+ return {
8061
+ type: "results",
8062
+ results: state.results.map((result) => {
8063
+ var _a;
8064
+ return __spreadProps(__spreadValues({}, result), {
8065
+ id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
8066
+ image: mapSpecImage(result.image),
8067
+ media: getDomainLayerMedia(result),
8068
+ onClick: () => onSelect(result)
8069
+ });
8070
+ })
8071
+ };
8018
8072
  };
8019
8073
 
8020
8074
  // src/renderers/mappers/sectionComponentToProps.ts
@@ -8129,7 +8183,6 @@ var upsellComponentToProps = (component, rendererMapperProps) => __spreadValues(
8129
8183
  "analyticsId",
8130
8184
  "type",
8131
8185
  "callToAction",
8132
- "context",
8133
8186
  "control",
8134
8187
  "margin",
8135
8188
  "media",
@@ -8308,7 +8361,7 @@ function useStableCallback(handler) {
8308
8361
  }
8309
8362
 
8310
8363
  // src/useDynamicFlow.tsx
8311
- var import_jsx_runtime6 = require("react/jsx-runtime");
8364
+ var import_jsx_runtime7 = require("react/jsx-runtime");
8312
8365
  var className = "dynamic-flow";
8313
8366
  var noop3 = () => {
8314
8367
  };
@@ -8359,7 +8412,12 @@ function useDynamicFlow(props) {
8359
8412
  scrollToTop
8360
8413
  }));
8361
8414
  const render = (0, import_react3.useMemo)(
8362
- () => getRenderFunction([CoreRootRenderer, CoreContainerRenderer, ...renderers]),
8415
+ () => getRenderFunction([
8416
+ CoreRootRenderer,
8417
+ CoreContainerRenderer,
8418
+ ...renderers,
8419
+ EmptyLoadingStateRenderer
8420
+ ]),
8363
8421
  [renderers]
8364
8422
  );
8365
8423
  const tree = componentToRendererProps(rootComponent, {
@@ -8376,7 +8434,7 @@ function useDynamicFlow(props) {
8376
8434
  validate: () => rootComponent.validate(),
8377
8435
  cancel
8378
8436
  },
8379
- view: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
8437
+ view: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
8380
8438
  ErrorBoundary_default,
8381
8439
  {
8382
8440
  onError: (error) => {
@@ -8386,7 +8444,7 @@ function useDynamicFlow(props) {
8386
8444
  errorMessage: getErrorMessage(error)
8387
8445
  });
8388
8446
  },
8389
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { id: normalisedFlowId, className, children: render(tree) })
8447
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { id: normalisedFlowId, className, children: render(tree) })
8390
8448
  }
8391
8449
  )
8392
8450
  };
package/build/main.mjs CHANGED
@@ -806,6 +806,7 @@ var getChildren = (node) => {
806
806
  case "heading":
807
807
  case "hidden":
808
808
  case "image":
809
+ case "loading-state":
809
810
  case "instructions":
810
811
  case "input-integer":
811
812
  case "list":
@@ -2061,7 +2062,7 @@ var debounce = (callback, waitMs) => {
2061
2062
  // src/domain/components/searchComponent/SearchComponent.ts
2062
2063
  var DEBOUNCE_TIME = 400;
2063
2064
  var createSearchComponent = (searchProps, performSearch, onBehavior, onComponentUpdate) => {
2064
- const { uid, analyticsId, control, emptyMessage, hint, margin, tags, title } = searchProps;
2065
+ const { uid, analyticsId, control, emptyMessage, initialState, hint, margin, tags, title } = searchProps;
2065
2066
  const update = getInputUpdateFunction(onComponentUpdate);
2066
2067
  let abortController = new AbortController();
2067
2068
  const search = (component2, query, searchConfig) => {
@@ -2075,7 +2076,7 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2075
2076
  }).then((state) => {
2076
2077
  if (!signal.aborted) {
2077
2078
  update(component2, (draft) => {
2078
- draft.state = state;
2079
+ draft.state = state != null ? state : initialState;
2079
2080
  draft.isLoading = false;
2080
2081
  draft.error = void 0;
2081
2082
  });
@@ -2097,9 +2098,10 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2097
2098
  analyticsId,
2098
2099
  control,
2099
2100
  emptyMessage,
2101
+ initialState,
2100
2102
  hint,
2101
2103
  margin,
2102
- state: null,
2104
+ state: initialState,
2103
2105
  tags,
2104
2106
  title,
2105
2107
  isLoading: false,
@@ -2108,11 +2110,22 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2108
2110
  update(this, updateFn);
2109
2111
  },
2110
2112
  onChange(query) {
2111
- this._update((draft) => {
2112
- draft.query = query;
2113
- draft.isLoading = true;
2114
- });
2115
- debouncedSearch(this, query.trim());
2113
+ if (query.trim()) {
2114
+ this._update((draft) => {
2115
+ draft.query = query;
2116
+ draft.isLoading = true;
2117
+ });
2118
+ debouncedSearch(this, query.trim());
2119
+ } else {
2120
+ abortController.abort();
2121
+ debouncedSearch.cancel();
2122
+ update(component, (draft) => {
2123
+ draft.query = query;
2124
+ draft.state = initialState;
2125
+ draft.isLoading = false;
2126
+ draft.error = void 0;
2127
+ });
2128
+ }
2116
2129
  },
2117
2130
  onSelect({ type, value }) {
2118
2131
  if (type === "action") {
@@ -2208,11 +2221,23 @@ var isValidResponseBody = (body) => {
2208
2221
  var hashRequest = (query, config) => JSON.stringify({ query, config });
2209
2222
 
2210
2223
  // src/domain/mappers/layout/searchLayoutToComponent.ts
2211
- var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint, method, param, title, url, margin, tags }, mapperProps) => {
2224
+ var searchLayoutToComponent = (uid, {
2225
+ analyticsId,
2226
+ control,
2227
+ emptyMessage = "",
2228
+ initialState,
2229
+ hint,
2230
+ method,
2231
+ param,
2232
+ title,
2233
+ url,
2234
+ margin,
2235
+ tags
2236
+ }, mapperProps) => {
2212
2237
  const { httpClient, onBehavior, onComponentUpdate } = mapperProps;
2213
2238
  const search = getPerformSearchFunction(
2214
2239
  httpClient,
2215
- (layout) => mapLayoutToComponent(`${uid}-search-response`, layout, mapperProps, []),
2240
+ (layout, index) => mapLayoutToComponent(`${uid}-search-response-${index}`, layout, mapperProps, []),
2216
2241
  { method, param, url }
2217
2242
  );
2218
2243
  return createSearchComponent(
@@ -2220,7 +2245,8 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2220
2245
  uid,
2221
2246
  analyticsId,
2222
2247
  control,
2223
- emptyMessage: emptyMessage != null ? emptyMessage : "",
2248
+ emptyMessage,
2249
+ initialState: getInitialState(uid, initialState, mapperProps),
2224
2250
  hint,
2225
2251
  margin: margin != null ? margin : "md",
2226
2252
  tags,
@@ -2231,6 +2257,33 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2231
2257
  onComponentUpdate
2232
2258
  );
2233
2259
  };
2260
+ var getInitialState = (uid, initialState, mapperProps) => {
2261
+ if (!initialState) {
2262
+ return emptyInitialState;
2263
+ }
2264
+ switch (initialState.type) {
2265
+ case "layout":
2266
+ return {
2267
+ type: "layout",
2268
+ content: initialState.content.map(
2269
+ (layout, index) => mapLayoutToComponent(`${uid}-initial-${index}`, layout, mapperProps, [])
2270
+ )
2271
+ };
2272
+ case "results":
2273
+ return {
2274
+ type: "results",
2275
+ results: initialState.results
2276
+ };
2277
+ default: {
2278
+ const exhaustiveCheck = initialState;
2279
+ return emptyInitialState;
2280
+ }
2281
+ }
2282
+ };
2283
+ var emptyInitialState = {
2284
+ type: "layout",
2285
+ content: []
2286
+ };
2234
2287
 
2235
2288
  // src/domain/components/SectionComponent.ts
2236
2289
  var createSectionComponent = (props) => {
@@ -2321,24 +2374,13 @@ var createUpsellComponent = (upsellProps, onComponentUpdate) => {
2321
2374
  };
2322
2375
 
2323
2376
  // src/domain/mappers/layout/upsellLayoutToComponent.ts
2324
- var upsellLayoutToComponent = (uid, {
2325
- analyticsId,
2326
- callToAction,
2327
- context,
2328
- control,
2329
- margin,
2330
- media,
2331
- onDismiss,
2332
- tags,
2333
- text
2334
- }, mapperProps) => {
2377
+ var upsellLayoutToComponent = (uid, { analyticsId, callToAction, control, margin, media, onDismiss, tags, text }, mapperProps) => {
2335
2378
  const { onComponentUpdate } = mapperProps;
2336
2379
  return createUpsellComponent(
2337
2380
  {
2338
2381
  uid,
2339
2382
  analyticsId,
2340
2383
  callToAction: getDomainLayerCallToAction(callToAction, mapperProps),
2341
- context: context ? mapLegacyContext(context) : "neutral",
2342
2384
  control,
2343
2385
  margin: margin != null ? margin : "md",
2344
2386
  media: getDomainLayerMedia({ media }),
@@ -6953,13 +6995,20 @@ var CoreContainerRenderer = {
6953
6995
  render: ({ children }) => /* @__PURE__ */ jsx3(Fragment2, { children })
6954
6996
  };
6955
6997
 
6998
+ // src/renderers/EmptyLoadingStateRenderer.tsx
6999
+ import { Fragment as Fragment3, jsx as jsx4 } from "react/jsx-runtime";
7000
+ var EmptyLoadingStateRenderer = {
7001
+ canRenderType: "loading-state",
7002
+ render: () => /* @__PURE__ */ jsx4(Fragment3, {})
7003
+ };
7004
+
6956
7005
  // src/renderers/CoreRootRenderer.tsx
6957
- import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
7006
+ import { Fragment as Fragment4, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
6958
7007
  var CoreRootRenderer = {
6959
7008
  canRenderType: "root",
6960
7009
  render: ({ children, childrenProps, subflow }) => {
6961
7010
  if ((subflow == null ? void 0 : subflow.presentation.type) === "push") {
6962
- return /* @__PURE__ */ jsx4(Fragment3, { children: subflow.children });
7011
+ return /* @__PURE__ */ jsx5(Fragment4, { children: subflow.children });
6963
7012
  }
6964
7013
  const [stepProps] = findRendererPropsByType(childrenProps, "step");
6965
7014
  return /* @__PURE__ */ jsxs2("div", { id: stepProps == null ? void 0 : stepProps.id, className: "dynamic-flow-step", children: [
@@ -6970,7 +7019,7 @@ var CoreRootRenderer = {
6970
7019
  };
6971
7020
 
6972
7021
  // src/renderers/getRenderFunction.tsx
6973
- import { Fragment as Fragment4, jsx as jsx5 } from "react/jsx-runtime";
7022
+ import { Fragment as Fragment5, jsx as jsx6 } from "react/jsx-runtime";
6974
7023
  var getRenderFunction = (renderers) => {
6975
7024
  function ComponentRenderer(props) {
6976
7025
  const { type } = props;
@@ -6990,9 +7039,9 @@ var getRenderFunction = (renderers) => {
6990
7039
  }
6991
7040
  const render = (props) => {
6992
7041
  if (!props) {
6993
- return /* @__PURE__ */ jsx5(Fragment4, {});
7042
+ return /* @__PURE__ */ jsx6(Fragment5, {});
6994
7043
  }
6995
- return /* @__PURE__ */ jsx5(ComponentRenderer, __spreadValues({}, props), props.uid);
7044
+ return /* @__PURE__ */ jsx6(ComponentRenderer, __spreadValues({}, props), props.uid);
6996
7045
  };
6997
7046
  return render;
6998
7047
  };
@@ -7889,14 +7938,17 @@ var getToolbarProps = (toolbar, rendererMapperProps) => {
7889
7938
 
7890
7939
  // src/renderers/mappers/rootComponentToProps.ts
7891
7940
  var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7892
- const childrenProps = rootComponent.getChildren().map((child) => {
7893
- if (child.type === "step") {
7894
- return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7895
- showBack: rootComponent.canPerformBack()
7896
- }));
7897
- }
7898
- return componentToRendererProps(child, rendererMapperProps);
7899
- });
7941
+ const childrenProps = [
7942
+ __spreadValues({ type: "loading-state", uid: "loading-state" }, rendererMapperProps),
7943
+ ...rootComponent.getChildren().map((child) => {
7944
+ if (child.type === "step") {
7945
+ return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7946
+ showBack: rootComponent.canPerformBack()
7947
+ }));
7948
+ }
7949
+ return componentToRendererProps(child, rendererMapperProps);
7950
+ })
7951
+ ];
7900
7952
  const subflow = rootComponent.subflow ? {
7901
7953
  presentation: rootComponent.subflow.presentation,
7902
7954
  children: rendererMapperProps.render(
@@ -7952,7 +8004,7 @@ var getSearchState = ({
7952
8004
  onChange,
7953
8005
  onSelect
7954
8006
  }) => {
7955
- if (!query || isLoading) {
8007
+ if (isLoading) {
7956
8008
  return { type: "pending" };
7957
8009
  }
7958
8010
  if (error) {
@@ -7972,19 +8024,21 @@ var getSearchState = ({
7972
8024
  layoutProps
7973
8025
  };
7974
8026
  }
7975
- if (state.results.length === 0) {
8027
+ if (query && state.results.length === 0) {
7976
8028
  return { type: "noResults", message: emptyMessage };
7977
8029
  }
7978
- const rendererResults = state.results.map((result) => {
7979
- var _a;
7980
- return __spreadProps(__spreadValues({}, result), {
7981
- id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
7982
- image: mapSpecImage(result.image),
7983
- media: getDomainLayerMedia(result),
7984
- onClick: () => onSelect(result)
7985
- });
7986
- });
7987
- return { type: "results", results: rendererResults };
8030
+ return {
8031
+ type: "results",
8032
+ results: state.results.map((result) => {
8033
+ var _a;
8034
+ return __spreadProps(__spreadValues({}, result), {
8035
+ id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
8036
+ image: mapSpecImage(result.image),
8037
+ media: getDomainLayerMedia(result),
8038
+ onClick: () => onSelect(result)
8039
+ });
8040
+ })
8041
+ };
7988
8042
  };
7989
8043
 
7990
8044
  // src/renderers/mappers/sectionComponentToProps.ts
@@ -8099,7 +8153,6 @@ var upsellComponentToProps = (component, rendererMapperProps) => __spreadValues(
8099
8153
  "analyticsId",
8100
8154
  "type",
8101
8155
  "callToAction",
8102
- "context",
8103
8156
  "control",
8104
8157
  "margin",
8105
8158
  "media",
@@ -8278,7 +8331,7 @@ function useStableCallback(handler) {
8278
8331
  }
8279
8332
 
8280
8333
  // src/useDynamicFlow.tsx
8281
- import { jsx as jsx6 } from "react/jsx-runtime";
8334
+ import { jsx as jsx7 } from "react/jsx-runtime";
8282
8335
  var className = "dynamic-flow";
8283
8336
  var noop3 = () => {
8284
8337
  };
@@ -8329,7 +8382,12 @@ function useDynamicFlow(props) {
8329
8382
  scrollToTop
8330
8383
  }));
8331
8384
  const render = useMemo(
8332
- () => getRenderFunction([CoreRootRenderer, CoreContainerRenderer, ...renderers]),
8385
+ () => getRenderFunction([
8386
+ CoreRootRenderer,
8387
+ CoreContainerRenderer,
8388
+ ...renderers,
8389
+ EmptyLoadingStateRenderer
8390
+ ]),
8333
8391
  [renderers]
8334
8392
  );
8335
8393
  const tree = componentToRendererProps(rootComponent, {
@@ -8346,7 +8404,7 @@ function useDynamicFlow(props) {
8346
8404
  validate: () => rootComponent.validate(),
8347
8405
  cancel
8348
8406
  },
8349
- view: /* @__PURE__ */ jsx6(
8407
+ view: /* @__PURE__ */ jsx7(
8350
8408
  ErrorBoundary_default,
8351
8409
  {
8352
8410
  onError: (error) => {
@@ -8356,7 +8414,7 @@ function useDynamicFlow(props) {
8356
8414
  errorMessage: getErrorMessage(error)
8357
8415
  });
8358
8416
  },
8359
- children: /* @__PURE__ */ jsx6("div", { id: normalisedFlowId, className, children: render(tree) })
8417
+ children: /* @__PURE__ */ jsx7("div", { id: normalisedFlowId, className, children: render(tree) })
8360
8418
  }
8361
8419
  )
8362
8420
  };
@@ -0,0 +1,5 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ export const CoreContainerRenderer = {
3
+ canRenderType: 'container',
4
+ render: ({ children }) => _jsx(_Fragment, { children: children }),
5
+ };
@@ -0,0 +1,12 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { findRendererPropsByType } from './utils';
3
+ export const CoreRootRenderer = {
4
+ canRenderType: 'root',
5
+ render: ({ children, childrenProps, subflow }) => {
6
+ if ((subflow === null || subflow === void 0 ? void 0 : subflow.presentation.type) === 'push') {
7
+ return _jsx(_Fragment, { children: subflow.children });
8
+ }
9
+ const [stepProps] = findRendererPropsByType(childrenProps, 'step');
10
+ return (_jsxs("div", { id: stepProps === null || stepProps === void 0 ? void 0 : stepProps.id, className: "dynamic-flow-step", children: [children, (subflow === null || subflow === void 0 ? void 0 : subflow.presentation.type) === 'modal' ? subflow.children : undefined] }));
11
+ },
12
+ };
@@ -0,0 +1,5 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ export const EmptyLoadingStateRenderer = {
3
+ canRenderType: 'loading-state',
4
+ render: () => _jsx(_Fragment, {}),
5
+ };